views:

23

answers:

2

UIButton has a single initializer buttonWithType. But this is a factory method and will create an autoreleased object. Of course we can do something like:

 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 50, 30)];

But in this case i will not be able to set the button's type as buttonType is a read only property.

So is there any way i can create buttons which are not autoreleased and still set their type?

P. S. :

  1. Using AutoreleasePool with the autoreleased objects is a good practice. But i don't really have a problem with autoreleased objects. This is just a doubt.

  2. I am not looking for solution for any particular scenario so please don't reply with questions like "Why do you want this?". It just occurred to me that this is something i am not able to do.. so i am asking..

Thanks, Swapnil

+1  A: 

You can use the initializer and later send the object a retain message if you still need it.

I think that the reason for the lack of other initializers is that UIButtons are typically added as a subview somewhere and thus receive a retain message automatically.

muffix
+2  A: 

No, only +buttonWithType: can create those special buttons. The reason why there isn't an +alloc/-init pair to construct such button is because they are actually implemented by some private subclass (e.g. UIRoundedRectButton).

If you need to retain the button, use -retain.

theButton = [[UIButton buttonWithType:foo] retain];
KennyTM