UIButton的 – 分配initWithFrame:与buttonWithType:

鉴于(任意):

CGRect frame = CGRectMake(0.0f, 0.0f, 100.0f, 30.0f); 

以下两个代码段有什么区别?

1。

  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = frame; 

2。

  UIButton *button = [[[UIButton alloc] initWithFrame:frame] autorelease]; 

我认为他们是相同的。 哈哈! 狡猾的问题,你偷偷摸摸的小朋克!

推理

  1. -buttonWithType:返回一个自动发布的UIButton对象。

  2. +[NSObject alloc]默认标量实例variables为0 ,所以buttonType应该是0或者UIButtonTypeCustom

优点缺点

  1. 你可能会认为使用-buttonWithType:更明确,并明确设置了buttonType ,并且在Apple将UIButtonTypeCustom更改为1而不是0 (这绝对不会发生)的情况下更安全。

  2. 另一方面,你也可以争辩说使用-initWithFrame足够清楚和安全。 此外,许多Xcode示例项目(如“TheElements”和“BubbleLevel”)都使用这种方法。 一个好处是,你可以显式释放UIButton然后在你的应用程序的主线程的运行循环中释放它的autorelease池。 而这就是为什么我更喜欢选项2。

我强烈build议使用第一种方法( +buttonWithType ),因为这是指定buttontypes的唯一方法。

如果你+allocbuttonType -initWithFrame:buttonType被设置为某个标准值(不知道哪一个,并且这可能在SDK的更高版本中改变),并且因为buttonType属性是只读的,所以你不能改变types。

主要的(也许是唯一的)区别在于内存pipe理:正如你所说, buttonWithType返回一个自动发布的UIButton 。 这样你就不用担心释放它。 另一方面,你并不拥有它,所以当你想要的时候你不能释放它(当然,除了自动释放池)。
显式调用[[UIButton alloc] initWithFrame:frame] ,而是dynamic地分配你的button,所以你拥有它,你负责释放它。
如果你打算保留你的button出于某种原因,那么也许你应该考虑第二种解决scheme,但是如果在这种情况下,你是立即自动释放它,那么创buildbutton的两种方式之间没有太大的区别…

两个选项是相同的,但我更喜欢选项2,因为它可以处理内存pipe理

你可以使用第一个做“[button retain]”,所以你永远不会失去指针。

我已经通过UIButton文档,在这里我发现:

讨论这个方法是一个方便的构造器,用于创build具有特定configuration的button对象。 如果你inheritanceUIButton,这个方法不会返回你的子类的一个实例。 如果你想创build一个特定的子类的实例,你必须直接分配/初始化button

我猜这是诀窍。 alloc-initWithFrame用于子类。