我正在尝试了解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]
还是会自动释放对象?
答案 0 :(得分:1)
一个好的,一般的规则是,无论你分配/初始化还是复制,你都“创造”并拥有,因此你必须释放它。所以是的,拥有玩家的对象需要在使用它时释放它。如果仅为方法中的局部范围创建Player对象,或者它是ivar,则适用。
请记住,如果您决定创建一个自动释放的Player对象,则需要通过属性点语法或实际保留消息来保留对象,以防止Player对象在本地方法完成后自动释放执行。
// Retaining an autoreleased object
self.player=[Player playerWithName: @"George"];
或
player=[[Player playerWithName: @"George"] retain];
祝你好运
答案 1 :(得分:1)
当您使属性“保留”时,编译器生成的setter方法负责确保正确释放和保留对象。此属性实质上处理释放它引用的前一个对象的工作,并保留(获取)已分配对象的所有权。您还需要在实现文件中添加以下代码,以便在释放Player对象时释放这些对象:
- (void) dealloc
{
[pType release];
[pWeapon release];
[super dealloc];
}
这意味着即使内部属性被“保留”,当分配“Player”对象时,您仍然需要在某个时刻释放它。
答案 2 :(得分:0)
[[Player alloc] init]
的调用者负责向新的Player对象发送release
消息。 Player对象的属性不会影响该责任。