对于以下程序,我收到以下错误 - 在第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对象。你能解释一下为什么不必发布吗?它没有在代码中的任何地方发布它仍然有用吗?
答案 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?