2010-06-29 48 views
2

如果我有這樣自動釋放以前的對象由分配

void setSomeObject(SomeObjectClass obj /*, and some other params*/) 
{ 
    [_previous autorelease]; 
    _previous = obj; 
} 

函數據我理解它的自動釋放消息被髮送到對象本身(未_previous) 所以在一個點上,有時當setSomeObject超出範圍的原始對象是autoreleased(如果有)。它是否正確?我不使用屬性,但我想通過使用它們釋放的前一個對象將是自動的,當我做self.previous = obj;

回答

1

當您發送-autorelease消息給對象時,它將被添加到活動的NSAutoreleasePool,當運行循環運行時該消息被清空。如果你說[_previous autorelease],那麼只有該對象會被自動釋放,如果你說_previous = obj,那隻會改變變量的引用。舊對象仍然是自動釋放的。

如果你在setter方法這樣做,這是個什麼模式一般爲:

- (void)setSomeObject:(MyObjClass *obj) { 
    if (obj != someObject) { 
     [someObject release]; 
     someObject = [obj retain]; // or copy, depending on what you want 
    } 
} 
+0

所以人們也可以寫[_previous自動釋放]但是它不是標準的感覺? (儘管需要確保它還沒有指向相同的對象) – BuggerMe 2010-06-29 01:36:10

+0

是的。如果你記得基本的內存管理規則,你擁有所有權的任何對象(由alloc/new/copy/retain獲得)必須稍後放棄(release或autorelease),所以任何一個都可以工作。但在這種情況下,不需要autorelease,因爲您不需要在函數的其餘部分引用該對象。 避免所有這些的另一種方法是使用@synthesize常規@property(copy)或(retain),它爲您創建訪問器方法,而不是執行我在我的答案中編寫的所有內容,您只需執行' self.someObject = obj'。 – jtbandes 2010-06-29 02:09:06

0

沒有那是不正確的。

[_previous autorelease]將autorelease消息發送到_previous。這是這個語法的含義。