发布或不发布

时间:2011-07-01 16:07:47

标签: iphone objective-c memory-management

我正在开发一个iPhone应用程序。

我有以下属性:

@property (nonatomic, retain) Point2D* endPoint;

这是同一个班级的方法:

- (id)initWithX:(CGFloat)x Y:(CGFloat)y;
{
    if (self = [super init])
    {
        endPoint = [[Point2D alloc] initWithX:x Y:y];

    ...
}

最后是同一类的dealloc方法:

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

我的问题是这段代码是否正确?

endPoint = [[Point2D alloc] initWithX:x Y:y];

或许我必须在这里做自动释放。

4 个答案:

答案 0 :(得分:5)

请阅读memory management guide,因为它会解释所有这些以及更多内容。

简而言之,该代码是正确的。

如果您执行了self.endPoint = [... alloc/init ...],那么您需要在init中自动发布或发布,以平衡额外的保留。

答案 1 :(得分:1)

您的作业

endPoint = [[Point2D alloc] initWithX:x Y:y];

不会增加retainCount,因此如果您想在以后使用endPoint,请不要在此处使用autorelease。

或者你可以像这样使用

self.endPoint = [[[Point2D alloc] initWithX:x Y:y] autorelease];

=>此赋值将增加endPoint的计数器。

答案 2 :(得分:0)

endPoint = [[Point2D alloc] initWithX:x Y:y];更改为

Point2D *temp = [[Point2D alloc] initWithX:x Y:y];
self.endPoint = temp;
[temp release];

利用属性保留装置。

答案 3 :(得分:0)

您不应该直接使用endPoint,而应该通过self.endPoint。

@property (nonatomic, retain) Point2D* endPoint;

- (id)initWithX:(CGFloat)x Y:(CGFloat)y;
{
    if (self = [super init])
    {
        self.endPoint = [[[Point2D alloc] initWithX:x Y:y] autorelease]; //It'll retain it for us.

    ...
}

- (void)dealloc {
    self.endPoint = nil; //setting it to nil means it'll release the object it was previously pointing to.
    [super dealloc];
}