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