iOS自动@synthesize而不创建ivar

iOS automatic @synthesize without creating an ivar

如果我有一个@property,我不想通过ivar来支持它,我简单地省略了@synthesize,并且有手动getter返回一个计算值。

但是,现在,由于xcode 4.4,如果我没有指定@synthesizedo编译器将自动生成它。这是否意味着它还将生成一个ivar,即使我不需要/使用它?

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


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

  • 如果你有读写属性,没有@synthesize,没有getter,也没有setter,那么它将生成ivar。
  • 如果你有一个读写属性,没有@synthesize,没有getter,也没有setter,那么它将生成ivar。
  • 如果您有一个readwrite属性,没有@synthesize,同时有getter和setter,那么它将不会生成ivar。
  • 如果您有一个只读属性,没有@synthesize和getter,那么它将生成ivar。
  • 如果您有一个readonly属性,没有@synthesize和getter,那么它将不会生成ivar。
  • 由此,我认为一般规则是,如果您没有@synthesize,并且没有完全实现该属性所需的所有方法,那么假设它是动态的,并且不会生成ivar。

    无论如何,如果您希望确保不生成IVAR,那么将其声明为@dynamic

    关于@dynamic的澄清

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

    You use the @dynamic keyword to tell the compiler that you will fulfill the API contract implied by a property either by providing method implementations directly or at runtime using other mechanisms such as dynamic loading of code or dynamic method resolution.

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


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

    接口声明:

    1
    @property (nonatomic, readonly) BOOL myBoolProp;

    强制执行:

    1
    2
    3
    - (BOOL)myBoolProp {
        return true;
    }

    尝试这个:

    1
    2
    3
    4
    - (void)viewDidLoad {
        [super viewDidLoad];
        _myBoolProp = true;
    }

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

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


    是的-ivar仍然由clang生成(不是xcode,因为它是ide,clang是真正重要的编译器)。

    如果您真的不想要ivars,也不想要实现,那么有一个有点陈旧的@dynamic关键字可以满足您的需要,或者您可以在协议中指定属性,这不会使其自动合成:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // .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.