I have used following 2 patterns to create a view.
@property (retain, nonatomic) SomeView* someView;
...
// First pattern
self.someView = [[SomeView alloc] initWithFrame frame];
// Second pattern
SomeView* aSomeView = [[SomeView alloc] initWithFrame];
self.someView = aSomeView;
[aSomeView release];
Now, looking back at this code, the first pattern’s method should be changed to
self.someView = [[[SomeView alloc] initWithFrame frame] autorelease];
shouldn’t it?
I feel dumb 🙁
Look at it like this:
The above line creates an object and gives it a retain count of 1.
This line leaves it with a retain count of two, because the someView property is declared with retain:
So, doing it this way leaves your someView property pointing to an object with retain count of 2. You can do it this way if you add an autorelease call to it:
Your second pattern is better, if you ask me. You create an object with a retain count of one. You assign it to a retaining property (now it has a retain count of 2) and then you release the original variable, leaving the object again with a retain count of 1. It’s three lines where you might want only one, but it makes sense in the right context. Additionally, it’s usually best to avoid using autorelease outside of an alloc or copy method since its usually an indication you don’t fully understand memory management in Obj-C.
And as a commenter said in the comments to the question, don’t feel dumb. None of this is intuitive at first. Nobody picks up a guitar and plays like Hendrix their first time.