【问题标题】:do I have to create a new object or can I use a method param?我必须创建一个新对象还是可以使用方法参数?
【发布时间】:2011-07-03 06:29:00
【问题描述】:

假设我有一个响应按钮事件的方法

- (void) myMethod: (id) sender

直接使用函数param更好吗?

NSLog(@"The sender tag is %d",sender.tag);

还是创建一个新对象更好?

UIButton* myButton = (UIButton*) sender;
NSLog(@"The sender tag is %d",myButton.tag);

为什么?

我在教程中看到,objective-c 中的首选方式是第二种方式。但是,如果您不需要知道发件人的类型而只需访问其属性/方法,则可以使用第一种方式。我错过了什么吗?

【问题讨论】:

  • 这是风格问题,避免警告。
  • 您没有在上面的任何代码中“创建新对象”。 UIButton* myButton = (UIButton*) sender; 只是将sender 中保存的地址复制到myButton。演员阵容甚至没有必要(除非您将某些深奥的编译器警告设置为暴躁的裤子)。

标签: iphone objective-c ios methods casting


【解决方案1】:

当你说UIButton* myButton = (UIButton*) sender; 时,你并不是在制作一个新对象。您只是在为sender 对象创建一个新句柄(指针),并明确告诉编译器它是UIButton

这意味着您可以在其上调用UIButton 方法,而不会让编译器抱怨它们可能不存在。

从记忆的角度来看,您应该假设它根本没有区别。编译器可能足够聪明,无论如何都不会为您创建一个新指针,即使这样做了,它也将是 4 个字节左右,这不值得担心。

【讨论】:

    【解决方案2】:

    你没有遗漏任何东西,这不是一个特别重要的问题。您有几个选择:

    NSLog(@"%d", sender.tag);
    

    编译时有时会产生警告,具体取决于方法参数的类型。

    NSLog(@"%d", ((UIButton *)sender).tag);
    

    或者最后:

    UIButton *button = (UIButton *)sender;
    NSLog(@"%d", button.tag);
    

    (这些基本上都做同样的事情,所以这主要是一个偏好问题。)

    【讨论】:

    • 所以在内存管理方面是完全一样的,对吧?
    • 是的,这段代码在内存管理方面没有任何作用。请记住,当您执行 UIButton *button = (UIButton *)sender 时,您只是在分配指针值。
    • 事实上,当你编译代码时(尤其是开启优化,甚至可能没有开启),你很可能从编译器得到完全相同的结果。
    【解决方案3】:

    如果发送者始终是 UIButton,我会将方法声明为

    - (void) myMethod: (UIButton*) sender
    

    因为它实际上产生了与指针类型转换相同的效果。它还为您节省了一行代码。

    【讨论】:

    • +1 但我通常声明定义标签属性的继承层次结构中的最高类,而没有做任何类似的研究......是 UIControl
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2019-09-23
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多