簡體   English   中英

Objective-C自動釋放池不釋放對象

[英]Objective-C autorelease pool not releasing object

我是Objective-C的新手,正在閱讀內存管理。 我試圖用NSAutoreleasePool玩一下但不知何故它不會釋放我的對象。

我有一個帶有setter和getter的類,它基本上設置了一個NSString *名稱。 釋放池后,我嘗試NSLog對象,它仍然有效,但我想它不應該?

@interface TestClass : NSObject
{
    NSString *name;
}

- (void) setName: (NSString *) string;
- (NSString *) name;


@end

@implementation TestClass   

- (void) setName: (NSString *) string
{
        name = string;
}  

- (NSString *) name
{
    return name;
}

@end

int main (int argc, const char * argv[]) {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

TestClass *var = [[TestClass alloc] init];

[var setName:@"Chris"];
[var autorelease];
[pool release];

// This should not be possible?
NSLog(@"%@",[var name]);


return 0;
}

當您釋放指針var時,您告訴操作系統它指向的內存可以重新分配。 指針仍然指向該內存,直到它被重新分配,它仍然包含您的對象的遺骸。 一旦重新分配,嘗試調用name方法將不再有效。

您的代碼有幾個問題。 首先,既不copy也不retain存儲在name實例變量中的字符串。 因此,如果字符串由將其存儲到屬性中的任何人釋放,則會留下懸空引用。 你應該做

- (void) setName: (NSString*) aName {
    if( name != aName ) {
        if( name ) [name release];
        name = [aName retain];    // or copy
    }
}

或者從一開始就使用屬性。

此外,如果在實例變量中保留對象引用,則應提供dealloc方法的正確定義:

- (void) dealloc {
    self.name = nil;
    [super dealloc];
}

最后,僅僅因為一個對象已被解除分配,並不意味着前一個實例的內存無效。 你的原始程序最有可能在一個懸空參考( var )上調用一個方法,這恰好在這里純粹運氣。 (特別是,( autorelease不會自動將引用設置為nil )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM