繁体   English   中英

保留/分配内存管理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM