UIButton - alloc initWithFrame:vs. buttonWithType:

时间:2011-06-05 21:08:53

标签: ios objective-c uibutton

给予(任意):

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];

6 个答案:

答案 0 :(得分:16)

我认为他们是等同的。哈哈!狡诈问你偷偷摸摸的小朋克!

推理

  1. -buttonWithType:会返回一个自动释放的UIButton对象。

  2. +[NSObject alloc]将标量实例变量默认为0,因此buttonType应为0UIButtonTypeCustom

  3. 优点&缺点

    1. 您可能会认为使用-buttonWithType:并明确设置buttonType会更清楚,如果Apple将UIButtonTypeCustom更改为1而不是{{}},则更安全{1}}(这肯定不会发生)。

    2. 另一方面,你也可以说它很清楚&安全到足以使用0。此外,许多Xcode示例项目,例如“TheElements”& “BubbleLevel”使用这种方法。一个优点是,您可以在运行循环之前显式释放-initWithFrame,因为应用程序的主线程已经耗尽了自动释放池。而且,这就是我更喜欢选项2的原因。

答案 1 :(得分:7)

我强烈建议使用第一种方法(+buttonWithType),因为这是指定按钮类型的唯一方法。

如果您+alloc-initWithFrame:,则buttonType设置为某个标准值(不确定哪个,这可能会在SDK的更高版本中更改)并且您不能之后更改类型,因为buttonType属性是只读的。

答案 2 :(得分:2)

主要(可能是唯一的)差异在于内存管理:正如您所说,buttonWithType会返回自动释放的UIButton。这样您就不必担心释放它了。另一方面,您不拥有它,因此您无法在需要时释放它(当然,除非drain自动释放池)。
显式调用[[UIButton alloc] initWithFrame:frame],您可以动态分配按钮,因此您拥有它,并且您负责释放它。
如果你打算出于某种原因保留你的按钮,那么也许你应该考虑第二种解决方案,但如果在这种情况下,你立即自动释放它,那么创建按钮的两种方式之间没有太大的区别。 ..

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用第一个并执行“[button retain];”,这样您就不会丢失指针。

答案 5 :(得分:0)

我已经浏览了UIButton文档,这里是我发现的:

  

讨论   此方法是一个便利构造函数,用于创建具有特定配置的按钮对象。如果您继承UIButton,则此方法不会返回子类的实例。 如果要创建特定子类的实例,则必须直接分配/初始化按钮

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