Objective-C对象泄漏错误

时间:2011-11-01 19:02:13

标签: objective-c ios5

对于以下程序,我收到以下错误 - 在第50行分配的对象的潜在泄漏。 50号线指向这条线 - self.receivedData = [[NSMutableData data] retain]; 我尝试在此语句之后释放receiveData,但这给了我一个错误“对象发送自动释放太多次了。”我不确定我是否正确行事。请帮助!

   - (void)viewDidLoad {

        NSURLRequest *theRequest = 
        [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://{your ip}:8080/activiti-rest/service/process-definitions?start=0&size=10&sort=id&order=asc"]                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                     timeoutInterval:10.0];

        NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

        if (theConnection) {       

            self.receivedData = [[NSMutableData data] retain];

        } else {


            UIAlertView *connectFailMessage = [[UIAlertView alloc] initWithTitle:@"NSURLConnection " message:@"Failed in viewDidLoad"  delegate: self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [connectFailMessage show];
            [connectFailMessage release];

        }

        [theConnection autorelease];

    }

编辑:在标题文件中,它被声明为@property(nonatomic,assign) NSMutableData *receivedData;
的 它删除了这一行[theConnection autorelease]后它工作。我保留了头文件中的assign属性,并添加了[self.receiveData release],就像你问的那样。它之前没有工作,因为我保留了这一行[theConnection autorelease]。我添加了它,因为我想知道我是否必须也请释放theConnection对象。你能解释一下为什么不必发布吗?它没有在代码中的任何地方发布它仍然有用吗?

4 个答案:

答案 0 :(得分:1)

self.receivedData指向一个属性。很可能这个属性设置了“retain”标志。因此,它保留给您,并且您在行中的明确保留是无关的并导致问题。

答案 1 :(得分:1)

receivedData属性是否在相应的头文件中声明为retain?这意味着当您为其分配对象时,该对象会自动发送retain消息。您无需亲自致电retain

答案 2 :(得分:1)

如果没有看到更多代码,分析仪可能会混淆。

你的平衡 - 释放在哪里?在-dealloc?

为什么这个属性不是 retain


你也应该在-dealloc中释放对象。你仍然没有回答为什么对象不是retain - 这看起来很奇怪。

答案 3 :(得分:0)

问题可能是你在没有首先释放它的情况下分配receivedData。尝试:

[self.receivedData release];
self.receivedData = [[NSMutableData data] retain];

编辑:上述原因。 receivedData被声明为“assign”属性。因此,如果在不先释放它的情况下分配给它,如果receivedData以前包含保留对象,则会发生内存泄漏。您当然可以将属性从assign更改为retain,但我怎么知道他没有充分的理由在第一时间使用assign?