What's the difference between the following two code snippets?
1.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = frame;
2.
UIButton *button = [[[UIButton alloc] initWithFrame:frame] autorelease];
I think they're equivalent. Haha! Trick question you sneaky little punk!
Reasoning
-buttonWithType:
returns an autoreleasedUIButton
object.
+[NSObject alloc]
defaults scalar instance variables to0
, sobuttonType
should be0
, orUIButtonTypeCustom
.Pros & Cons
You could argue that it's clearer to use
-buttonWithType:
and setbuttonType
explicitly and that it's safer in case Apple changesUIButtonTypeCustom
to be1
instead of0
(which will most certainly never happen).On the other hand, you could also argue that it's clear & safe enough to use
-initWithFrame
. Plus, many of the Xcode sample projects, such as "TheElements" & "BubbleLevel," use this approach. One advantage is that you can explicitly release theUIButton
before the run loop for your application's main thread has drained its autorelease pool. And, that's why I prefer option 2.I would strongly suggest using the first approach (
+buttonWithType
), because that's the only way to specify the button type.If you
+alloc
and-initWithFrame:
, thebuttonType
is set to some standard value (not sure which, and this could change in later versions of the SDK) and you can't change the type afterwards because thebuttonType
property is read only.