Is AutoRelease redundant when using ARC in Objective-C?

六月ゝ 毕业季﹏ 提交于 2019-12-01 11:32:01

问题


I'm pretty new to Objective-C, as you may gather, and until recently, I hadn't really understood the need for all this AutoRelease malarky. I think that's mostly because I've started Objective-C with ARC, and haven't had any exposure to doing retains and release.

Anyway, my understanding now is that pre-ARC, if you created an object and needed to return a pointer to it as the returning object of the method/function, you would need to autorelease it, because you are unable to do the "[obj release]" after doing "return obj;"

Worrying about retains and releases isn't an issue with ARC. Does this mean that in our own code, there is really point in creating our own autoreleased objects? Ie, doing [[[Class alloc] init] autorelease]? From what I've gathered, we should still setup autorelease pools, but only because other frameworks or libraries may still return autoreleased objects, but we no longer need to explicitly create autoreleased objects ourselves - is this a fair understanding?

Thanks, Nick


回答1:


When using ARC, you do not want to do any memory management yourself. Specifically you will not be calling release and auto release because it does it all for you. In fact, the compiler should probably complain if you try to manage memory yourself.

Instead of [[[Class alloc] init] autorelease]; you'll just call [[Class alloc] init];

I recommend reading this blog post for some really good background on ARC and memory management in general.




回答2:


Well, your understanding is quite correct. With ARC we do not release or autorelease any more. Just have to make sure that we assign nil (or some other reasonable value) to any reference to objects, which we do not need any more. In the worst case we could still constantly consume additional memory but the memory cannot leak any ore.

And yes, we still maintain autorelease pools for the sake of using framework libraries (linked ones) that may not use ARC.

To answer your question between the lines about the purpose of autorelease. This applies to non-ARC project only, of course. In the good old days Objective-C did not offer any reference counting but its retain counting. Any allocated memory of objects, that are not retained (or have a retain count of 0) is considered free and may soon be claimed and used by other objects. This means that every object needs to be retained after its allocation, assuming that you want to keep it around. When the object is not used any more then you need to release it. This comes with two risks. Well, alloc does retain it once automatically. 1) You may forget to release an object that is unused. In the worst case you may even loose all references to an object that stays in memory for ever since. 2) You may still refer to an object hat has been released already and then try accessing it which will most likely end in an BAD_EXC exception.

All this can be quite annoying. In order to get rid of some of these obligations for objects that don't stay around very long, the autorelease was invented. For temporary objects only you alloc it (release-count = 1) and autorelease it. That means that the object will be automatically released (retain count reduced by 1) within the next autorelease circle. But the object remains allocated for your method while it is being executed. Typically the reference variable would be a local one.

Sample:

-(void) myMethod{

AClass *someObject = [[[AClass alloc] init] autorelease];

// use the object

// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject:

// don't care any more

}

And that not required any more when using ARC.



来源:https://stackoverflow.com/questions/9752790/is-autorelease-redundant-when-using-arc-in-objective-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!