2011-03-30 38 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