2011-03-30 37 views
1

如果我有一個包含另一個對象Item的對象Sale。比方說,我的銷售標題是這樣的:在Objective-C中釋放對象的正確方法

#import <Foundation/Foundation.h> 
    #import "Item.h" 

    @interface Sale : NSObject { 
     Item *item; 
    } 

    @property (readonly) Item *item; 

    -(id) initWithItem:(Item*)i; 

    @end 

而在我的函數創建一個新的項目和銷售對象,像這樣:

Item *i = [[Item alloc] init]; 
    Sale *s = [[Sale alloc] initWithItem:i]; 
    [i release]; 

如果,當我與銷售對象做了我簡單地做:

[s release]; 

是足以確保所有內存分配的有效清理?

此外,如果我稍後嘗試訪問[s項目],將釋放*我會導致任何問題?

回答

1

這取決於你如何儲存i。如果您將其複製或保留在initWithItem:中,則需要將其發佈到Saledealloc方法中(請參見下文)。如果你存儲一個弱引用,這沒問題。

- (id)initWithItem:(Item *)i { 
    if ((self = [super init])) { 
    // If you're retaining i here, you need to release it in dealloc. 
    item = [i retain]; 
    } 

    return self; 
} 

- (void)dealloc { 
    [item release]; 
    [super dealloc]; 
} 

有關更多信息,請參閱Apple的Memory Management Programming Guide

+0

如果我只是指定我喜歡這個怎麼樣?: item = i; – link664 2011-03-30 22:21:15

+0

@ link664在這種情況下,您正在存儲一個弱引用:'s'不擁有'i',它只是引用它。因此,如果你在's'之外釋放'i'(如你的例子),如果你試圖訪問'[s item]',你將遇到問題。我建議你在初始化程序中複製/保留'i',並在'dealloc'中釋放它。 – 2011-03-30 22:29:44