Ios UIButton-alloc initWithFrame:vs.buttonWithType:
给定(任意): 以下两段代码之间有什么区别 一, 二,Ios UIButton-alloc initWithFrame:vs.buttonWithType:,ios,objective-c,uibutton,Ios,Objective C,Uibutton,给定(任意): 以下两段代码之间有什么区别 一, 二, 我认为他们是对等的。哈哈!你这个卑鄙的小混蛋 推理 -buttonWithType:返回一个自动删除的UIButton对象 +[NSObject alloc]默认标量实例变量为0,因此buttonType应为0,或UIButtonTypeCustom 利弊 你可能会争辩说,使用-buttonwhithtype:和显式设置buttonType更为清晰,如果苹果将UIButtonTypeCustom更改为1,而不是0(这肯定永远不会发生),则会
我认为他们是对等的。哈哈!你这个卑鄙的小混蛋 推理
-buttonWithType:
返回一个自动删除的UIButton
对象+[NSObject alloc]
默认标量实例变量为0
,因此buttonType
应为0
,或UIButtonTypeCustom
-buttonwhithtype:
和显式设置buttonType
更为清晰,如果苹果将UIButtonTypeCustom
更改为1
,而不是0
(这肯定永远不会发生),则会更安全-initWithFrame
足够清晰和安全。另外,许多Xcode示例项目,如“TheElements”和“BubbleLevel”,都使用这种方法。一个优点是,您可以在应用程序主线程的运行循环耗尽其自动释放池之前显式释放ui按钮。这就是为什么我更喜欢选择2
buttonWithType
返回一个自动删除的UIButton
。这样你就不用担心发布它了。另一方面,您并不拥有它,因此您无法在需要时释放它(当然,如果您drain
autorelease池,则除外)而是显式调用
[[UIButton alloc]initWithFrame:frame]
,动态地分配按钮,因此您拥有它,并负责释放它<如果你打算保留某个原因的按钮,那么也许你应该考虑第二个解决方案,但是,如果在这种情况下,你立即自动调整它,创建按钮的两种方法没有太大区别…两个选项相同,但我更喜欢选项2,因为它可以处理内存管理我强烈建议使用第一种方法(+buttonWithType
),因为这是指定按钮类型的唯一方法
如果您
+alloc
和-initWithFrame:
,则按钮类型设置为某个标准值(不确定是哪个,这可能会在SDK的更高版本中更改),并且以后无法更改类型,因为按钮类型
属性是只读的。您可以使用第一个并执行“[按钮保留];”,因此,您永远不会丢失指针。我浏览了ui按钮的文档,这里是我发现的:
讨论
此方法是一个方便的构造函数,用于创建具有特定配置的按钮对象。如果将UIButton子类化,则此方法不会返回子类的实例如果要创建特定子类的实例,必须直接alloc/init按钮
我想这就是诀窍。alloc initWithFrame
用于子类。“-[NSObject init]默认标量实例变量为0”否,实际上是+alloc
将实例变量设置为0。“所以buttonType应该是0”否,这取决于-[UIButton init]
(如果有这样的方法)的作用。当然,它当前可能会将其设置为0或不设置(在这种情况下,它将为0);但由于该方法没有被记录在案,他们将来可能会改变它的行为。你对它的功能没有任何保证。我知道这很旧,但我注意到你必须使用[UIButton buttonwhithtype::]
你的按钮类型从未设置过。此外,您还编写了-buttonWithType
作为实例方法,它应该是一个类方法,因此您需要将-
替换为+
。此外,如果要进行子类化,则必须使用initWithFrame方法。
CGRect frame = CGRectMake(0.0f, 0.0f, 100.0f, 30.0f);
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = frame;
UIButton *button = [[[UIButton alloc] initWithFrame:frame] autorelease];