我正在开发一个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];
或许我必须在这里做自动释放。
答案 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];
}