/自動釋放混亂,我慢慢地自學可可爲iPhone(通過Stanford Class on iTunes U)和我剛剛通過對內存管理的部分走了,我想希望得到一些證實的假設我正在處理如何處理內存以及[釋放]和[autorelease]如何工作。由於內存管理是一個非常基礎且基本的,但非常重要的編程經驗的一部分,我想確保我做對了。釋放可可的iPhone
據我所知,有什麼頁頭,新,或複製需要被釋放。
如果我這樣做:
NSString *temp = [[NSString alloc] initWithString:@"Hello World"];
然後我需要添加[臨時發佈/自動釋放]最後,因爲我有一個頁頭。
但是,如果我這樣做:
NSString *temp = @"Hello World";
然後,它似乎並不需要釋放的語句。 NSString類是否作爲賦值的一部分自動調用autorelease?
此外,有沒有這些語句後,這裏兩個*臨時對象之間有什麼區別?它們都包含相同的字符串,但它們在哪裏有不同的內存/使用方式?
其次,性能,我假設自動釋放自動處理。如果我有這樣的:
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property NSString *firstName;
@property NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
//HERE!!!!
[super dealloc];
}
我假設我並不需要添加[名字發佈]和[姓氏釋放(在//此處!!!!),因爲這是自動的處理性能。那是對的嗎?
我也明白,如果我這樣做的代碼(假設我定義initWithFirstName):
Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];
,後來我將不得不使用[我發佈/自動釋放]。
任何確認或修正我的理解迄今幫助是極大的讚賞。
郵政的答案寫了
我以爲會在所有的答案,測試出的建議後,我會寫這一切並談什麼工作。
我需要添加[名字發佈],[姓氏發行],但我還需要(保留)添加到屬性的描述。不添加(保留)導致的警告,因爲它假定(分配)。下面是我終於成立了類
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
[firstName release];
[lastName release];
[super dealloc];
}
我沒有明確地分配/復制/保留firstName或lastName。這是否需要,因爲alloc是通過綜合自動生成來推斷的,我只是在代碼中看不到? – 2009-07-13 19:12:56
從某種意義上說。問題的關鍵在於你的對象擁有firstName和lastName,所以當它們被設置時,它就成爲你釋放它們的責任。 – 2009-07-13 19:29:02