2012-07-11 127 views
-3

可以請用下面的方法告訴哪一個是最好的方法?在下面的方法中釋放對象的正確方法是什麼?

@implementation Person 
@synthesize name; 
- (void)dealloc { [self.name release]; [super dealloc]; } 
@end 



@implementation Person 
    @synthesize name; 
    - (void)dealloc { [name release]; [super dealloc]; } 
    @end 



@implementation Person 
@synthesize name; 
- (void)dealloc { [name release]; name = nil;[super dealloc]; } 
@end 
+2

第三個是最好的 – Bhupesh 2012-07-11 09:54:41

+0

我相信所有的都是一樣的,因爲當你合成時你沒有改變實例變量,因此你可以像訪問實例變量一樣訪問getter和setter。 – Pochi 2012-07-11 09:55:01

+0

您是否使用ARC啓用或禁止?我建議使用ARC – 2012-07-11 09:55:14

回答

0

這一個是最適合我

@implementation Person 
@synthesize name; 

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

和你的第一個是錯錯就錯

+0

您不應該在dealloc或init中使用合成的setter,它可能會導致意外的行爲(例如通過KVO通知)。第三個例子是我使用的例子 – wattson12 2012-07-11 10:25:25

2

好一日一肯定是不對的:

(From Apple's documentation)

請勿在初始化程序方法中使用訪問器方法,並且dealloc。唯一的 的地方你不應該使用訪問器方法來設置實例變量 是在初始化方法和dealloc。


現在第二個是蘋果在他們的示例應用程序中使用的。


在我,雖然最後一個觀點是(可能成爲)最好的,因爲通過該指針設置爲 nil確保對(釋放)指針只會提出任何呼叫的消息 nil(這是安全的,在這裏對釋放的對象的調用不是)。另外請記住,如果該屬性定義爲 retain設置爲 nil也將調用 release

0

對於非ARC版本,第三個是最好的,因爲它通過將其指向nil來照顧已發佈的變量。

但正如Apple推薦的那樣,請使用ARC構建項目。

從蘋果公司的文件

在自動引用計數,或ARC,該系統使用相同的 引用計數系統MRR,但它插入適當的 內存管理方法,在編譯時呼喚你。 您是 強烈建議將ARC用於新項目。如果您使用ARC,那麼 通常不需要了解本文檔中描述的基礎實施 ,雖然在某些情況下它可能對 有幫助。

相關問題