簡體   English   中英

iOS自動@synthesize而不創建ivar

[英]iOS automatic @synthesize without creating an ivar

如果我有一個@property ,我不想都通過支持ivar我只是省略了@synthesize ,不得不返回哪一個計算值手動干將。

但是,現在從Xcode 4.4開始,如果我沒有指定@synthesize ,編譯器會自動生成它。 這是否意味着即使我不需要/使用它也會產生ivar

我最終可能會強制使用dynamic來自動合成。 然而,這是錯誤的,因為如果在其他地方或運行時期間實現了getter和setter ,則應該使用@dynamic來關閉警告。

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

  1. 如果你有一個readwrite屬性,沒有@synthesize ,有一個getter而且沒有setter,那么它將生成iVar。
  2. 如果你有一個readwrite屬性,沒有@synthesize ,沒有getter,並且有一個setter,那么它將生成iVar。
  3. 如果你有一個readwrite屬性,沒有@synthesize並同時擁有一個getter和一個setter,那么它就不會生成iVar。
  4. 如果你有一個readonly屬性,沒有@synthesize並且沒有getter,那么它將生成iVar。
  5. 如果你有一個readonly屬性,沒有@synthesize並有一個getter,那么它將不會生成iVar。

從這一點來看,我認為一般規則是如果你沒有@synthesize ,並且擁有完全實現該屬性所需的所有方法,那么它被認為是動態的並且不生成iVar。

無論如何,如果你想確保沒有生成iVar,那么將它聲明為@dynamic


關於@dynamic的澄清

來自Objective-C編程語言 聲明屬性

您可以使用@dynamic關鍵字告訴編譯器您將通過直接提供方法實現或在運行時使用其他機制(如動態加載代碼或動態方法解析)來履行屬性隱含的API契約。

對我來說,即使您直接實現getter和setter,也可以將屬性標記為@dynamic。

如果您將該屬性標記為只讀並自己實現getter,則似乎不會創建iVar。

接口聲明:

@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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM