给予(任意):
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];
答案 0 :(得分:16)
我认为他们是等同的。哈哈!狡诈问你偷偷摸摸的小朋克!
-buttonWithType:
会返回一个自动释放的UIButton
对象。
+[NSObject alloc]
将标量实例变量默认为0
,因此buttonType
应为0
或UIButtonTypeCustom
。
您可能会认为使用-buttonWithType:
并明确设置buttonType
会更清楚,如果Apple将UIButtonTypeCustom
更改为1
而不是{{}},则更安全{1}}(这肯定不会发生)。
另一方面,你也可以说它很清楚&安全到足以使用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
用于子类。