iOS自动@synthesize而不创build伊娃

如果我有一个@property ,我不想通过ivar支持我简单地省略@synthesize和手动getters返回一个计算值。

但是现在从Xcode 4.4开始,如果我没有指定@synthesize ,编译器会自动生成它。 这是否意味着它也会产生ivar即使我不需要/使用它?

我最终可能会强制不使用dynamic自动合成。 然而,这是错误的,因为@dynamic应该用来closures警告,如果getter和setter在其他地方或运行时执行 。

在我的工作中,我注意到了以下行为。

  1. 如果你有一个readwrite属性,没有@synthesize ,有一个getter,没有setter,那么它会生成iVar。
  2. 如果你有一个readwrite属性,没有@synthesize ,没有getter,并有一个setter,那么它将生成iVar。
  3. 如果你有一个readwrite属性,没有@synthesize并且有一个getter和一个setter,那么它将不会生成iVar。
  4. 如果你有一个只读属性,没有@synthesize并且没有getter,那么它将会生成iVar。
  5. 如果你有一个只读属性,没有@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.