在我阅读的几乎所有书籍和我经历过的例子中,我看到指针以这种方式初始化。假设我有一个我要初始化的类变量 NSString * myString 。我几乎总会看到这样做:
-(id)init {
if (self = [super init]) {
NSString *tempString = [[NSString alloc] init];
self.myString = tempString;
[tempString release];
}
return self;
}
为什么我不能只做以下事情?
-(id)init {
if (self = [super init]) {
self.myString = [[NSString alloc] init];
}
return self;
}
我不明白为什么首先需要额外的 tempString ,但我可能会在这里遗漏内存管理。我想要做的事情是可接受的还是会引起某种泄漏?我在developer.apple.com上阅读了“内存管理指南”,除非我遗漏了一些内容,否则我看不出其中的差别。
答案 0 :(得分:5)
如果self.myString
是保留属性,则第二个示例必须是
-(id)init {
if (self = [super init]) {
self.myString = [[[NSString alloc] init] autorelease];
}
return self;
}
否则会泄漏。我只能假设是这种情况,第一个例子只是想避免使用autorelease
。
答案 1 :(得分:4)
第二个例子是正确的。
假设myString
是一个ivar,第一个例子实际上是错误的,因为它为myString
留下了一个悬空指针(一个指向解除分配对象的指针)。如果它是self.myString
那将是一个不同的故事。