15

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

但是,现在从 Xcode 4.4 开始,如果我不指定@synthesizedo 编译器将自动生成它。这是否意味着它也会产生一个ivar我不需要/使用它的偶数?

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

4

3 回答 3

37

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

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

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

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


澄清@dynamic

来自Objective-C 编程语言中的声明属性

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

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

于 2012-10-17T12:06:39.487 回答
2

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

接口声明:

@property (nonatomic, readonly) BOOL myBoolProp;

实施:

- (BOOL)myBoolProp {
    return true;
}

试试这个:

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

将产生错误:使用未声明的标识符 '_myBoolProp'

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

于 2012-10-17T12:10:40.663 回答
-1

是的 - 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.
于 2012-10-17T12:07:30.437 回答