在Objective-C中释放对象的正确方法

在Objective-C中释放对象的正确方法,objective-c,memory-management,Objective C,Memory Management,如果我有一个包含其他物品的物品销售。假设我的销售标题如下所示: #import <Foundation/Foundation.h> #import "Item.h" @interface Sale : NSObject { Item *item; } @property (readonly) Item *item; -(id) initWithItem:(Item*)i; @end 如果,当我处理完销售

如果我有一个包含其他物品的物品销售。假设我的销售标题如下所示:

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

    @interface Sale : NSObject {
        Item *item;
    }

    @property (readonly) Item *item;

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

    @end
如果,当我处理完销售对象时,我只是:

    [s release];
这足以确保有效地清理所有内存分配吗


此外,如果我以后尝试访问[s项],释放*i是否会导致任何问题?

这取决于您如何存储
i
。如果您在
initWithItem:
中复制或保留它,则需要在
Sale
dealloc
方法中释放它(见下文)。如果您存储的是弱引用,这是可以的

- (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];
}

有关更多信息,请参阅苹果的。

这取决于您如何存储
i
。如果您在
initWithItem:
中复制或保留它,则需要在
Sale
dealloc
方法中释放它(见下文)。如果您存储的是弱引用,这是可以的

- (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];
}

有关更多信息,请参阅苹果的。

如果我只是指定我喜欢这个,如何?:item=I@link664在这种情况下,您正在存储一个弱引用:
s
不拥有
i
,它只是有一个对它的引用。因此,如果您在
s
之外释放
i
(如您的示例所示),如果您试图访问
[s项]
,您将遇到问题。我建议您在初始化器中复制/保留
I
,并在
dealloc
中释放它。如果我只是分配我喜欢的内容,如何?:item=I@link664在这种情况下,您正在存储一个弱引用:
s
不拥有
i
,它只是有一个对它的引用。因此,如果您在
s
之外释放
i
(如您的示例所示),如果您试图访问
[s项]
,您将遇到问题。我建议您在初始化器中复制/保留
I
,并在
dealloc
中释放它。