簡單的問題我似乎無法找到一個快速的帖子;如果我正在使用屬性,還是必須分配我的對象
,如果我有一個對象,讓說:
NSString *myString_;
@property(readwrite, retain)NSString* myString;
@synthesize myString = myString_;
當我合成這種,這是否分配存儲器的對象?
感謝
簡單的問題我似乎無法找到一個快速的帖子;如果我正在使用屬性,還是必須分配我的對象
,如果我有一個對象,讓說:
NSString *myString_;
@property(readwrite, retain)NSString* myString;
@synthesize myString = myString_;
當我合成這種,這是否分配存儲器的對象?
感謝
@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)是無限小的。當然,你不必這樣做,但這是一個好習慣。
@Josh,我'我做了更正。謝謝。 – Patrick
號你要麼ALLOC &初始化一個對象,然後在屬性設置它,鼻翼:
self.myString = [[NSString alloc] initWithString: @"Hello Miek"];
或者你有一個已分配的&保留的字符串,你將設置你的新房產。
要回答你的問題:不,該屬性和綜合調用不會分配任何內存。你必須這樣做。如果你不這樣做,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];
乾杯(長的答案,有一點點時間對我的手;)
用於發佈內存管理訪問器實現的道具;我的答案假設用戶在啓用ARC的iOS5上,調用釋放或保留將在ARC上失敗。另請閱讀我上面有關訪問外部訪問器的iVar的更新。 – Patrick
抱歉所有的編輯。無法讓代碼正確發佈 – Miek
這是這樣的一個副本:http://stackoverflow.com/questions/3488446/is-a-synthesized-property-already-alloc-init-ed – Lefteris