我是否必须创建一个新对象或者我可以使用方法参数?

时间:2011-07-03 06:29:00

标签: iphone objective-c ios methods casting

所以,假设我有这个响应按钮事件的方法

- (void) myMethod: (id) sender

直接使用函数参数是否更好?

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

或者创建新对象会更好吗?

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

为什么?

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

3 个答案:

答案 0 :(得分:3)

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

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

从记忆的角度来看,你应该假设它没有任何区别。编译器可能足够智能,无论如何都不会让你成为一个新的指针,即使它确实如此,它也将是4个字节左右,这是不值得担心的。

答案 1 :(得分:2)

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

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

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

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

或者最后:

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

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

答案 2 :(得分:1)

如果发件人总是UIButton,我会将方法声明为

- (void) myMethod: (UIButton*) sender

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