2011-11-01 27 views
0

对于程序下面我得到在线分配的对象的以下无错误 潜在泄漏50. 线50个指向此line-- self.receivedData = [[NSMutableData数据]保留]; 我试图在此语句后释放receiveData,但是这给了我一个错误“object sent autorelease too much times。”我不知道我是否按照正确的方式去做。请帮忙!Objective-C的对象的泄漏误差

- (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自动释放。我把头像文件中的assign属性保留下来,并像你问的那样添加了[self.receiveData release]。它之前没有工作,因为我保留了这一行[theConnection autorelease]。我添加了它,因为我想知道如果我不得不也可以释放连接对象。请你解释为什么不必发布它?它不会在代码中的任何地方发布,它仍然有效?

+0

receivedData如何在头文件中声明? –

+0

我在我的问题中编辑了它。仔细检查一下 –

+0

不知道问题出在哪里。需要更多的代码。 –

回答

1

没有看到更多的代码,分析器可能会感到困惑。

你的平衡在哪里?在-dealloc中?

为什么这个属性不是retain在第一位?


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

+0

我发布了didFailWithError和didFinishLoading方法中的对象 –

+0

我是首发,我正在使用http://cagt.bu.edu/w/images/8/8b/URL_Connection_example.txt这个链接开始。在这个他有严格提到在.h文件中执行相同的操作 –

+0

错误是因为我没有在分配给它之前释放receivedData。此外,我想我错误地试图释放连接对象。我删除了该行代码,现在它工作。谢谢! –

1

self.receivedData指向一个属性。该属性很可能具有“保留”标志集。因此,它保留给你,你明确保留在行中是无关紧要的,并导致问题。

+0

如果该属性是“非原子的,分配”,这个答案是不对的。 – bbum

1

receivedData属性是否在相应的头文件中声明为retain?这意味着当您为其分配一个对象时,该对象会自动发送一条retain消息。你不需要自己拨打retain

+0

该属性被声明为@property(nonatomic,assign)NSMutableData * receivedData; –

+0

这不是通常的方法来声明对象类型属性是'assign',除非它们是代表或类似的。尝试将该属性切换为“复制”或“保留”,并将呼叫移至“保留”。 – Jim

0

问题可能是您正在分配receivedData而未先释放它。请尝试:

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

编辑:上述原因。receivedData被声明为“assign”属性。因此,如果您先分配给它而不先释放它,则如果receivedData先前包含保留对象,则会发生内存泄漏。你当然可以改变财产从分配到保留,但我怎么知道他没有一个很好的使用分配的理由呢?

+0

我试过了 - [self.receivedData release]; self.receivedData = [NSMutableData data]; 它说不是由调用者在这一点上拥有的对象的引用计数的不正确递减 –

+0

它在我删除此行[theConnection autorelease]后工作。 我把头像文件中的assign属性保留下来,并像你问的那样添加了[self.receiveData release]。它之前没有工作,因为我保留了这一行[连接autorelease]。我添加了它,因为我想知道如果我还必须发布连接对象。请你解释为什么不需要发布它?它不会在代码中的任何地方发布,它仍然有效? –

+0

解释倒票? –