2010-01-21 107 views
1

在下面的代码中,是否需要将发件人投递给UISlider?无论如何,我无法真正看到发件人是UISlider对象的原因?将发件人强制转换为发件人对象类型?

-(IBAction)sliderChangeGoat:(id)sender { 
    UISlider *slider = sender; // OR UISlider *slider = (UISlider*)sender; 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", (int)[slider value]]; 
    [sliderLabel_003 setText:newText]; 

    if((int)[slider value] > 0) [goatLabel setText:@"Goats:"]; 
    } else [goatLabel setText:@"None:"]; 

    [newText release]; 
} 

EDIT_001:

那是我在想什么(@chuck),你是什么意思?我不确定这是不是更改名称发件人的错误形式?

-(IBAction)sliderChangeGoat:(UISlider*)slider { 
} 

千恩万谢

加里

回答

3

它没有区别。 id等价于任何其他对象指针类型。所有使用更具体的类型都是允许编译器检查它的属性是什么,以及你发送它声明的类响应的对象消息。

如果您确实希望以这种方式静态输入,则可以仅使参数本身为(UISlider *)slider。参数名称就像任何其他参数名称 - 它只是一个变量。我经常在委托方法中将其更改为“未使用”,我不关心发件人,只是为了明确说明,如果我将其他东西挂钩,它就不会改变。正如我所说,UISlider*id相同,只是它限制了您可以发送的消息而不会收到警告。

1

铸造它明确可以帮助编译器确认你的意图。如果您看到编译器警告,请继续并投射。

+0

讽刺的是,当消息传递'id'时,你不会*获得*编译器警告,只有运行时错误。如果你输入的是静态的,那么编译器会提醒你,因为它能更好地理解你的意图。 – 2010-01-21 22:10:25

+0

这是奎因的一个好点。感谢澄清。 – 2010-01-21 22:12:41

+1

如果某个方法存在多个冲突的定义(例如'setSomething:(NSNumber *)num'和'setSomething:(NSInteger)num'),那么当您使用'id'时,您可能会收到警告,但不会显式静态类型。但是一般来说,编译器会更多的使用静态类型变量来抱怨 - 这就是完成这一点的关键。 – Chuck 2010-01-21 22:14:08

0

Objective-C是一种动态语言。在运行时,它会尝试向发送者发送值消息。如果你的发件人是UISlider,它就会起作用。就像其他人说的那样,如果你看到一个警告继续,改变方法声明或者转换发送者,但即使你不这样做,它也会工作。