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];
我认为他们是相同的。 哈哈! 狡猾的问题,你偷偷摸摸的小朋克!
推理
-
-buttonWithType:
返回一个自动发布的UIButton
对象。 -
+[NSObject alloc]
默认标量实例variables为0
,所以buttonType
应该是0
或者UIButtonTypeCustom
。
优点缺点
-
你可能会认为使用
-buttonWithType:
更明确,并明确设置了buttonType
,并且在Apple将UIButtonTypeCustom
更改为1
而不是0
(这绝对不会发生)的情况下更安全。 -
另一方面,你也可以争辩说使用
-initWithFrame
足够清楚和安全。 此外,许多Xcode示例项目(如“TheElements”和“BubbleLevel”)都使用这种方法。 一个好处是,你可以显式释放UIButton
然后在你的应用程序的主线程的运行循环中释放它的autorelease池。 而这就是为什么我更喜欢选项2。
我强烈build议使用第一种方法( +buttonWithType
),因为这是指定buttontypes的唯一方法。
如果你+alloc
和buttonType
-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
用于子类。