使用clang发现内存泄漏但无法释放和自动释放崩溃

时间:2010-03-15 00:00:37

标签: iphone objective-c memory-leaks clang

我有一个基于一些传入变量构建请求的类。该类还具有接收数据的所有委托方法,并将其存储在属性中以供调用类检索。

当类初始化时,它会创建一个连接,然后返回自己:

NSURLConnection *connection;
if (self = [super init]) {
    self.delegate = theDelegate;
    ...some code here...
    connection = [[NSURLConnection alloc] initWithRequest:theRequest  delegate:self  startImmediately:YES];
}
return self;

所以我无法正常释放它,如果我自动释放它崩溃了。是否需要释放调用类的工作?如果是这样,只是释放初始化对象也释放连接或者您是否必须专门发布它?如果是这样,你会怎么样?

由于

3 个答案:

答案 0 :(得分:3)

使connection成为实例变量并按需释放它。 “谁”应该释放对象的问题严格依赖于对象的语义和层次结构。

答案 1 :(得分:0)

为什么要在构造函数中打开NSURLConnection

通常,构造函数不应执行此类工作。如果连接与对象关联,我会在对象的connection方法中将[connection release];作为对象的属性和dealloc

答案 2 :(得分:0)

请记住,你不应该完全信任Clang。它可以而且确实报告假阴性和误报。

Clang每天都在好转,但现在还处于起步阶段。它非常好地与Xcode集成,但请记住它确实存在一些缺陷。

在这种情况下,它取决于您存储连接对象的变量的范围。如果它被声明为实例变量,那么它应该没问题,只要你在dealloc或其他一些中释放它当你完成它时,请指出。

如果您在问题中发布了connection的声明是您的init方法的本地声明,那么Clang正确地报告了泄漏。您应该使connection成为实例变量或属性,并确保以dealloc或完成后释放它。