对于下面的程序,我得到以下错误-在第50行分配的对象可能发生泄漏。第50行指向这条线自我。receivedData = [[NSMutableData数据]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];
}
Edit:在头文件中声明为@property(nonatomic,assign) NSMutableData *receivedData;
新它工作后,我删除了这一行[连接自动释放]。我保留了指派属性,因为是在头文件中,并添加了[self。如你所要求的。它之前没有工作,因为我保留了这一行[连接自动释放]。我添加了它,因为我想知道我是否也必须释放连接对象。你能解释一下为什么不用公布吗?它没有在代码的任何地方发布,它仍然可以工作??
如果没有看到更多的代码,分析器可能会感到困惑。
你的平衡释放在哪里?在dealloc吗?
为什么属性不是 retain
?
您也应该在-dealloc中释放对象。而且你还没有回答为什么这个物体不是retain
——这似乎很奇怪。
self。receivedData指向一个属性。这个属性很可能设置了"保留"标志。因此,它是为您保留的,并且您在行中显式保留是无关的,并导致问题。
receivedData
属性是否在相应的头文件中声明为retain
?这意味着当您将对象分配给它时,该对象将自动发送retain
消息。你不需要自己调用retain
问题可能是您正在分配receivedData而没有首先释放它。试一试:
[self.receivedData release];
self.receivedData = [[NSMutableData data] retain];
编辑:上述原因。receivedData被声明为一个"assign"属性。因此,如果对它进行赋值而不首先释放它,那么如果receivedData先前包含保留的对象,就会发生内存泄漏。你当然可以将属性从分配改为保留,但是我怎么知道他一开始就没有使用分配的好理由呢?