我担心自己很蠢。
我花了大约三个小时来追踪一个破坏我的理智的内存泄漏,在评论了我的应用程序的一半后,我得出了以下结论。
在适当的地方给出以下内容。
NSString *blah;
@property (nonatomic, retain) NSString *blah;
@synthesize blah;
-(id)initWithBlah:(NSString*)b {
self.blah = b; //this leaks
blah = b; //this does not
}
我对于objectice c并不是特别有经验,我明白如果我在调用object.blah = b;我会透明地调用一个保留b的setter函数。在函数内部,我假设通过设置self.blah = b我出于某种原因双重保留?
有人可以向我解释为什么会这样,或者不是我可能做错了什么?
干杯
答案 0 :(得分:2)
blah = b
直接修改类实例变量。
self.blah = b
如果存在,将调用访问者 - 从而保留,根据需要释放资源。
您应该在dealloc方法中添加[blah release];
,以便在您的课程发布时释放资源。
答案 1 :(得分:2)
你错了。 blah = b;
赋值没有多大意义,因为在您的代码从initWithBlah:
返回后,您再也无法依赖于字符串了。无论何时访问它,它很可能已被解除分配。
self.blah = b;
分配是正确的,因为它调用了setter,从而获得了字符串的所有权。当然,您也必须在blah
中释放-dealloc
,以防止内存泄漏。
答案 2 :(得分:1)
如果你只给blah,它不会为字符串分配,如果你给self.blah,它然后尝试启动self并为self类分配并尝试为你试图访问的变量分配,所以你必须在dealloc方法中释放它或使blah = nil。
即
- (void)dealloc
{
self.blah = nil;
or
[self.blah release];
}
答案 3 :(得分:0)
使用访问器很好,如果它泄漏则会出现其他问题。
特别是你的初始化程序必须正确调用,即遵循Cocoa Memory Management指南,参数不是被调用者隐式拥有的。
所以下面的内容很好,因为它传递了一个自动释放的字符串:
YourObj *obj = [[YourObj alloc] initWithBlah:[NSString stringWithString:@"blah"]];
由于传入保留的字符串而导致以下泄漏:
YourObj *obj = [[YourObj alloc] initWithBlah:[[NSString alloc] initWithString:@"blah"]];
您必须注意的另一件事是声明的属性不会自动处理清理,因此请务必在-dealloc
中处理:
- (void)dealloc {
self.blah = nil;
// ...
}