iOS自动@synthesize而不创建ivar

时间:2012-10-17 11:57:02

标签: ios ivar

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

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

我最终可能会强制使用dynamic进行自动合成。但是这样做是错误的,因为@dynamic应该用来关闭警告getter and setter are implemented somewhere else or during runtime

3 个答案:

答案 0 :(得分:35)

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

  1. 如果你有一个readwrite属性,没有@synthesize,有一个getter而且没有setter,那么它将生成iVar。
  2. 如果你有一个readwrite属性,没有@synthesize,没有getter,并且有一个setter,那么它将生成iVar。
  3. 如果你有一个readwrite属性,没有@synthesize并同时拥有一个getter和一个setter,那么它就不会生成iVar。
  4. 如果你有一个只读属性,没有@synthesize并且没有getter,那么它将生成iVar。
  5. 如果你有一个只读属性,没有@synthesize并且有一个吸气剂,那么它将不会生成iVar。
  6. 由此,我认为一般规则是,如果你没有@synthesize,并且拥有完全实现该属性所需的所有方法,那么它被认为是动态的并且不会生成IVAR。

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


    关于@dynamic的澄清

    来自Declared Properties中的The Objective-C Programming Language

      

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

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

答案 1 :(得分:2)

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

接口声明:

@property (nonatomic, readonly) BOOL myBoolProp;

Impementation:

- (BOOL)myBoolProp {
    return true;
}

试试这个:

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

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

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

答案 2 :(得分:-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.