0

我正在尝试了解 iOS 上的内存管理。我创建了这个界面:

@interface Player : NSObject {
    PlayerType pType;
    PlayerWeapon pWeapon;
}

@property(nonatomic, readwrite, retain) pType;
@property(nonatomic, readwrite, retain) pWeapon;

@end

这在实现文件中:

@synthesize pType;
@synthesize pWeapon;

在头文件中,我使用该retain属性,因为 pType 和 pWeapon 不是标准的 C 结构。据我了解,如果它们是 C 结构,我会assign改用。既然我用过retain,这是否意味着这个类保留了对象或实例化它的任何类?例如,如果我在另一个班级这样做:

Player *player = [[Player alloc] init];

这个新类必须调用[player release]还是会自动释放对象?

4

3 回答 3

1

一个好的一般规则是,无论您分配/初始化或复制您已“创建”并拥有的任何内容,因此您必须释放它。所以是的,拥有播放器的对象在使用完后需要释放它。这适用于仅为方法内的本地范围创建 Player 对象,或者它是 ivar 的情况。

但请记住,如果您决定创建一个自动释放的 Player 对象,您将需要通过属性点语法或实际的保留消息来保留该对象,以防止 Player 对象在本地方法完成执行后被自动释放。

// Retaining an autoreleased object
self.player=[Player playerWithName: @"George"];

或者

player=[[Player playerWithName:  @"George"] retain]; 

祝你好运

于 2011-11-03T21:27:20.170 回答
1

当您使属性“保留”时,编译器生成的 setter 方法负责确保正确释放和保留对象。该属性本质上处理释放它所引用的前一个对象并保留(取得所有权)分配的对象的工作。您还需要在实现文件中添加以下代码,以便在释放 Player 对象时释放这些对象:

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

这意味着即使内部属性是“保留的”,当分配“播放器”对象时,您仍然必须在某个时候释放它。

于 2011-11-03T21:40:06.623 回答
0

的调用者[[Player alloc] init]负责向新的 Player 对象发送release消息。Player 对象的属性不影响该职责。

于 2011-11-03T21:14:38.840 回答