2012-08-17 51 views
0

我知道在類的方法中分配值的正確約定是不使用setter版本。在初始化方法中使用setters(objective-c)

假設你有一個init方法是這樣的:

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate; 
@property (nonatomic, strong) NSString *stringData; 

@synthesize delegate = _delegate; 
@synthesize stringData = _stringData; 

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate 
{ 
    // initialization happens here 
} 

弧前,你會確保正確的保留政策,:

stringData = [aString retain]; 
self.delegate = aDelegate; 

弧,會怎麼做分配,並保證那個ivars不會太早發佈?

因爲你不知道什麼樣的工作,也許發生在一個setter覆蓋的情況下,在幕後,我的印象是,你不能做的:

self.stringData = aString 

什麼是正確的初始模式?

回答

1

由於您使用性能

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate; 
@property (nonatomic, strong) NSString *stringData; 

@synthesize delegate = _delegate; 
@synthesize stringData = _stringData; 

所以按照ARC,對象工作如轉讓。但「強」基本上不像保留那樣工作,因爲保留只增加引用計數,而用ARC,強類型的對象肯定存在,直到該類的實例存在。因此,在init方法

應該

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate 
{ 
// now _stringData and _delegate are getter instance of property variables. so either you can use self.stringData and self.delegate or _stringData and _delegate. 
    _stringData = aString; 
    _delegate = aDelegate; 
} 
0

你可以,事實上你應該(在大多數情況下)使用存取訪問你的ivars,甚至在你用ARC實現時也是如此。然後你會想到更聰明。將不會有ivars「太早」發佈。

+0

忘記的合成需要注意的是有存取。問題已更新。 – 2012-08-17 17:46:22

+0

在init或dealloc中使用訪問器的問題是它們可能具有副作用或假定不包含在部分(de)構造對象中的不變量。蘋果[明確表示不](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html),所以如果你使用他們生成的訪問器,你應該大概遵循他們的建議。 – Chuck 2012-08-17 20:30:33

0

只分配給伊娃。根據變量的內存管理策略(__strong,__weak__unsafe_unretained),ARC將負責保留和釋放。這就是ARC的重點。所以你的代碼示例應該是:

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate 
{ 
    stringData = aString; 
    delegate = aDelegate; 
} 

另外,你應該複製那個字符串而不是保留。所以,你會聲明二傳手作爲@property (nonatomic, copy) NSString *stringData;和init方法的實現是:

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate 
{ 
    stringData = [aString copy]; 
    delegate = aDelegate; 
} 
+0

你會永遠複製任何類型而不是簡單的分配嗎?你不會複製哪些類型? – 2012-08-17 17:44:20

+0

@HowardSpear:字符串,數組和字典至少應該總是被複制。您想複製的原因是這些類具有可變的變體,並且您通常不希望與其他人共享可變字符串。在實例變量中共享可變對象意味着它們可以在沒有警告的情況下更改,這可能會導致一些奇怪的行爲。 – Chuck 2012-08-17 18:08:39