2012-05-26 57 views
2

我知道這可能不一定只適用於@properties,但它們將是最常見的用例。如果有,例如:初始化Objective-C屬性的最佳實踐

@property (strong) NSObject *object; 

... 

@synthesize object = _object; 

是可能的初始化它的類的init方法聲明它在像這樣:

- (id)init { 
    self = [super init]; 
    if (self) { 
     _object = [[NSObject alloc] init]; 
    } 
} 

或覆蓋吸氣劑和初始化它在第一使用方法:

- (NSObject *)object { 
    if (!_object) { 
     _object = [[NSObject alloc] init]; 
    } 
    return _object; 
} 

哪個更好用?這是否取決於使用場景(例如,聲明屬性的對象是否具有多個初始值,屬性的類型,使用方式等)?

我在重寫getter時看到的真正優點是隻有在需要時纔會分配該屬性,但缺點是第一次訪問會更慢。

請注意,在訪問init方法中的屬性時,最好是將它們作爲self.object還是_object訪問?

+1

確保在開始設置屬性前使用init方法中的if(self){' – lnafziger

+0

糟糕。修復。感謝您的注意。 我不會在Xcode中錯過它,它只是不是我在這裏討論的內容的一部分,所以我在盯着純文本字段時忘了它。 – Greg

回答

2

我個人覺得在init方法中初始化會更好,那麼對象的預期壽命就會更加清晰,並且還會考慮如果init的對象失敗,是不是更好地在init中獲取比在您做一個得到?

我還喜歡使用self.object作爲屬性,因爲它使用了對象的getter和setter以及「self」。說清楚並避免需要保留的情況。當然在某些情況下,比如在你的例子中,它可能會導致更多的代碼行,但我依靠編譯器來優化代碼。

例如

yourobjclass* tmp = [[yourobjclass alloc] init]; 
self.object = tmp; 
[tmp release]; 
+0

但是,如果您不覆蓋訪問者,則直接訪問還是通過屬性存在區別? – Greg

+0

我總是訪問該屬性,但在'init'方法中,我在某處直接訪問它是更好的選擇。所以我想知道。 – Greg

+1

@PartiallyFinite編碼的目的之一是讓其他程序員通過使用自己來讀取代碼,以使其意圖清晰。在前綴中明確說明應如何處理對象,如果不是,在所有情況下是否要保留或不保證永遠不會總是有意義的。 –