Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将UIImage分配到内存并在iphone上发布的正确方法是什么_Iphone_Memory Leaks_Uiimageview - Fatal编程技术网

将UIImage分配到内存并在iphone上发布的正确方法是什么

将UIImage分配到内存并在iphone上发布的正确方法是什么,iphone,memory-leaks,uiimageview,Iphone,Memory Leaks,Uiimageview,使用仪器时,我不断被指向带有UIImage的内存泄漏。 我想我正在正确分配和释放内存。仪器中泄漏的物体被称为NSConcreteData 以下是分配和发布UIImage的正确方法吗 UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]]; [flagimg release]; flagimg =nil; imageWithData和dataWithContentsOfURL都返回自动

使用仪器时,我不断被指向带有UIImage的内存泄漏。
我想我正在正确分配和释放内存。仪器中泄漏的物体被称为NSConcreteData

以下是分配和发布UIImage的正确方法吗

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];    
[flagimg release];
flagimg =nil;

imageWithData
dataWithContentsOfURL
都返回自动删除的对象,因此该代码段中应该没有内存泄漏


由于
flagimg
返回自动释放,您的
[flagimg释放]不需要调用;您过度释放了该对象。

[UIImage imageWithData:]
返回一个自动释放的对象,您不应再次释放该对象。因此,被截取的代码不包含内存泄漏,而是相反的,一个双重空闲(在最坏的情况下)

请注意,仪器有时会产生假阳性和/或报告基金会本身的内存泄漏(YEP,它们也会犯错:-)。 分配/释放对象的最快方法是避免使用方便的初始值设定项(如imageWithData:),而是使用

NSData*data=[[NSData alloc]initWithContentsOfURL:url]]
UIImage*img=[[UIImage alloc]initWithData:data]
[数据发布]
//使用您的图像
[img释放] 这将立即分配和释放对象,而不是等到自动释放池被清理


但也请注意,内存泄漏通常不是尚未释放的内存,而是已丢失且无法再释放的内存,因此将由自动释放池释放的对象不被视为内存泄漏。

作为一般规则,您可以这样说

如果你创建了一个对象,其中有一个“init”、“copy”或“retain”,你必须释放它。 如果不是,则会得到一个自动释放的对象

这并不总是正确的,但在大多数情况下,

双重释放的后果是什么?通常是EXC_BAD_访问(通常称为segfault)导致程序崩溃。如果您有一个对已解除分配的对象的引用,并且您试图访问它,也会发生这种情况。