iOS自动@synthesize而不创build伊娃
如果我有一个@property
,我不想通过ivar
支持我简单地省略@synthesize
和手动getters返回一个计算值。
但是现在从Xcode 4.4开始,如果我没有指定@synthesize
,编译器会自动生成它。 这是否意味着它也会产生ivar
即使我不需要/使用它?
我最终可能会强制不使用dynamic
自动合成。 然而,这是错误的,因为@dynamic
应该用来closures警告,如果getter和setter在其他地方或运行时执行 。
在我的工作中,我注意到了以下行为。
- 如果你有一个readwrite属性,没有
@synthesize
,有一个getter,没有setter,那么它会生成iVar。 - 如果你有一个readwrite属性,没有
@synthesize
,没有getter,并有一个setter,那么它将生成iVar。 - 如果你有一个readwrite属性,没有
@synthesize
并且有一个getter和一个setter,那么它将不会生成iVar。 - 如果你有一个只读属性,没有
@synthesize
并且没有getter,那么它将会生成iVar。 - 如果你有一个只读属性,没有
@synthesize
并有一个getter,那么它将不会生成iVar。
从这个angular度来看,我认为一般的规则是,如果你没有@synthesize
,并且拥有完全实现这个属性所需要的所有方法,那么就假定它是dynamic的,并且不会生成iVar。
无论如何,如果你想确保没有生成iVar,那么声明它为@dynamic
。
澄清@dynamic
Objective-C编程语言中的 声明属性
您可以使用@dynamic关键字来告诉编译器,您将通过直接提供方法实现或在运行时使用其他机制(如dynamic加载代码或dynamic方法parsing)来实现属性所隐含的API合同。
对我来说,这听起来像是可以将属性标记为@dynamic,即使直接执行getter和setter也是如此。
如果您将该属性标记为只读,并自己实现getter,则似乎不会创buildiVar。
接口声明:
@property (nonatomic, readonly) BOOL myBoolProp;
Impementation:
- (BOOL)myBoolProp { return true; }
尝试这个:
- (void)viewDidLoad { [super viewDidLoad]; _myBoolProp = true; }
会产生一个错误:使用未声明的标识符'_myBoolProp'
删除自定义getter方法也会消除这个错误,显示出现在已经生成了iVar。
是的 – iVars仍然是由clang
生成的(不是Xcode,因为它是IDE,clang是真正重要的编译器)。
如果你真的不想要iVars,也不想要一个实现,有一个古老的@dynamic
关键字可以做你想做的,或者你可以指定一个协议的属性,合成:
// .h @property (nonatomic, retain) NSObject *someProp; //.m @dynamic someProp; // no iVars generated // other solution @protocol MyObjectProtcol<NSObject> @property (nonatomic, retain) NSObject *someProp; @end // now, when you implement the MyObjectProtocol protocol, the property won't auto-synthesize.