Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIButton-alloc initWithFrame:vs.buttonWithType:_Ios_Objective C_Uibutton - Fatal编程技术网

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