Whats the correct way to alloc a UIImage to memory

2019-04-01 16:52发布

Using Instruments, I keep on getting pointed to a memory leak with a UIImage.
I think I'm assigning and releasing the memory correctly. The leaked object in instruments is described as NSConcreteData

Is the following the correct way to assign and release a UIImage?

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

3条回答
叼着烟拽天下
2楼-- · 2019-04-01 17:20

as a general rule you can say

if you create an object an theres a "init","copy" or "retain" in it, you have to release it. if not, you get an autoreleased object.

thats not always true, but in most cases

查看更多
Melony?
3楼-- · 2019-04-01 17:31

both imageWithData and dataWithContentsOfURL return autoreleased objects, so you should have no memory leaks in that code snippet.

Since flagimg is returned autoreleased, your [flagimg release]; call is not needed; you're over-releasing that object.

查看更多
贼婆χ
4楼-- · 2019-04-01 17:38

[UIImage imageWithData:] returns an autoreleased object, which should not be released by you again. So this code snipped contains not a memory leak but the opposite, a double free (in the worst case).

Note that Instruments sometimes generates false positives and/or reports memory leaks in the Foundation itself (yep, they make mistakes too :-).

The fastest way to alloc/release an object is to avoid convenience initializers (like imageWithData:) and instead to something like

NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];

This will allocate and release your object right away and not wait until the autorelease pool is cleaned.

But please note too, that a memory leak is generally not memory that is not yet freed, but that is lost and cannot be freed anymore, so an object which will be deallocated by the autorelease pool is not considered a memory leak.

查看更多
登录 后发表回答