iOS 自动@synthesize,无需创建 ivar



如果我有一个不想通过ivar支持的@property,我只需省略@synthesize并有返回计算值的手动 getter。

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

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

在我使用它的过程中,我注意到以下行为。

  1. 如果你有一个读写属性,没有@synthesize,有一个getter并且没有一个setter,那么它将生成iVar。
  2. 如果你有一个读写属性,没有@synthesize,没有getter,并且有一个setter,那么它将生成iVar。
  3. 如果你有一个读写属性,没有@synthesize并且同时有一个getter和一个setter,那么它不会生成iVar。
  4. 如果你有一个只读属性,没有@synthesize,也没有getter,那么它将生成iVar。
  5. 如果你有一个只读属性,没有@synthesize并且有一个getter,那么它不会生成iVar。

由此,我认为一般规则是,如果您没有@synthesize,并且拥有完全实现该属性所需的所有方法,那么它被认为是动态的并且不会生成 iVar。

无论如何,如果要确保不生成 iVar,请将其声明为@dynamic.


关于@dynamic的澄清

从 Objective-C 编程语言中声明的属性:

使用 @dynamic 关键字告诉编译器,您将通过直接提供方法实现或在运行时使用其他机制(如动态加载代码或动态方法解析)提供方法实现来实现属性隐含的 API 协定。

对我来说,即使您直接实现 getter 和 setter,也可以将属性标记为 @dynamic。

如果您将属性标记为只读并自己实现 getter,则似乎不会创建 iVar。

接口声明:

@property (nonatomic, readonly) BOOL myBoolProp;

宣传:

- (BOOL)myBoolProp {
return true;
}

尝试这个:

- (void)viewDidLoad {
[super viewDidLoad];
_myBoolProp = true;
}

将生成错误:使用未声明的标识符"_myBoolProp">

删除自定义 getter 方法也会删除错误,似乎表明 iVar 现已生成。

是的- iVar 仍然由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.

最新更新