所以,假设我有这个响应按钮事件的方法
- (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中的首选方式是第二种方法。但是,如果您不需要知道发件人的类型并只访问其属性/方法,那么使用第一种方法应该没问题。我错过了什么吗?
答案 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
因为它实际上对指针类型转换产生相同的效果。它还为您节省了一行代码。