2012-06-04 49 views
2

簡單的問題我似乎無法找到一個快速的帖子;如果我正在使用屬性,還是必須分配我的對象

,如果我有一個對象,讓說:

NSString *myString_; 
@property(readwrite, retain)NSString* myString; 
@synthesize myString = myString_; 

當我合成這種,這是否分配存儲器的對象?

感謝

+1

抱歉所有的編輯。無法讓代碼正確發佈 – Miek

+1

這是這樣的一個副本:http://stackoverflow.com/questions/3488446/is-a-synthesized-property-already-alloc-init-ed – Lefteris

回答

2

@synthesize所做的就是爲您的屬性生成訪問器(setter和getter)並創建一個具有相同名稱的實例變量。使用equals的附加步驟登錄:

@synthesize mystring = _string; 

...重命名實例變量爲您_string(或任何名字您選擇,爲下劃線只是一個蘋果約定)。這是很好的做法,因爲讓實例變量與訪問器共享相同的名稱可能會產生問題。有了underbar可以讓你區分兩者。

這基本上是生成了什麼(假定ARC爲ON):

// getter 
- (NSString*)mystring 
{ 
    return _string; 
} 

// setter 
- (void)setMyString:(NString*)myString 
{ 
    _myString = myString; 
} 

可以初始化你財產(使用self.propertyName)的init方法:

-(id)init 
{ 
    self.myString = @"Something"; // or use an alloc init method in the class 
} 

或者你可以通過重寫getter來延遲初始化它:

- (NSString*)myString 
{ 
    if (!_myString) { // same as saying if nil and therefore doesn't exist yet 
     _myString = @"Something"; 
    } 
    return _myString; 
} 

另請注意,您不需要單獨聲明變量(即,你不需要NSString * mystring)。聲明財產時只需使用強或弱代替保留。

您應該直接訪問實例變量的唯一位置在訪問器中,這允許您通過單個網關控制對它的所有操作。在類中使用訪問器的開銷(即self.mystring)是無限小的。當然,你不必這樣做,但這是一個好習慣。

+0

@Josh,我'我做了更正。謝謝。 – Patrick

2

號你要麼ALLOC &初始化一個對象,然後在屬性設置它,鼻翼:

self.myString = [[NSString alloc] initWithString: @"Hello Miek"]; 

或者你有一個已分配的&保留的字符串,你將設置你的新房產。

1

要回答你的問題:不,該屬性和綜合調用不會分配任何內存。你必須這樣做。如果你不這樣做,myString實際上在施工時指向零。 不要使用Michael的例子,因爲它會泄漏內存。

使用

self.myString = @"Hello Miek"; 

的@字面實際上相當於調用[的NSString stringWithString:]類方法 它返回一個自動釋放(當然分配的)對象。或者你可以用這個

NSString *aString = [[NSString alloc] initWithString: @"string...."]; 
self.myString = aString; 
[aString release]; 

另外請注意,你應該聲明該屬性爲副本,而不是保留爲NSStrings。 在你的dealloc中,你也必須釋放myString。

最後,帕特里克的回答是不是100%正確的,因爲對留置財產的合成的setter看起來是這樣的:

-(void) setMyString: (NSString*) string { 
    [myString release]; 
    myString = [string retain]; 
} 

並就有關帕特里克的答案最後一點,它不建議在init方法中使用 中的setter。因此,而不是

self.myString = @"xyz"; 

建議直接訪問伊娃:

//or _myString, if you synthesized it that way of course 
myString = @"xyz"; 
[myString retain]; 

乾杯(長的答案,有一點點時間對我的手;)

+0

用於發佈內存管理訪問器實現的道具;我的答案假設用戶在啓用ARC的iOS5上,調用釋放或保留將在ARC上失敗。另請閱讀我上面有關訪問外部訪問器的iVar的更新。 – Patrick

相關問題