2012-02-28 66 views
1

可能重复:
what is this weird code notation mean(anObject *)在语句前做了什么?

我以前问过这个问题......

Understanding memory management in ios

的一两件事,质疑该行didnt教我(NSArray *)在以下声明中做了什么:

NSArray *myArray = (NSArray *)[someNSSet allObjects]; 

为什么不是它只是:

NSArray *myArray = [someNSSet allObjects]; 

或者换一种说法,你怎么这两种说法在他们做了什么不同?目前我不明白(NSArray *)位,所以我只是无视它,对我来说他们看起来一样!

在此先感谢

+0

这是一个类型演员。 – 2012-02-28 19:12:06

回答

3

这是一个类型转换,它说“的返回值转换为这种类型的”†。这是在Objective-C没有意义的,因为id转换和从任何其他对象指针类型,但其他一些语言需要更多的类型转换,所以有些人这样做是出于习惯,而其他人只是这样做,因为他们真的,真的喜欢明确性。

我一般会建议不要这样做,因为在很少发生错误的情况下(例如,该方法返回NSString*并且将它分配给NSArray*),这将抑制编译器的警告。如上所述,如果方法确实返回兼容类型,则不需要执行此操作。所以盲目地做这件事只会在Objective-C中伤害你。

†关于转换的注意事项:当您投射包含所有Objective-C对象类型的指针时,实际上并没有改变指针所引用的东西的类型,而只是指针本身。所以你不能以这种方式将一种类型的对象变成另一种。如果你施放一个NSString*NSDictionary*,对象仍然是一个NSString - 你刚刚骗了关于它的编译器,所以当你尝试调用allKeys也不会提醒你,而是你的程序将只炸毁在运行。

+0

非常好,非常感谢您的解释。 – 2012-02-28 19:28:35

0

这是一个类型转换。在上述情况下,它是不是因为[someNSSet allObjects];回报和NSArray*反正必要的,但你需要它,无论你需要指定对象(通常来自id)的类型,所以编译器知道什么方法调用实际生成。

1

这是一个类型转换声明。在简单赋值的情况下,它是无关紧要的 - Objective C允许您为任何类型变量指定一个无类型对象ref(id)。但是,无论如何,人们都会用C/C++惰性写出它们。

有时是必需的。例如:

NSString *s = [(UILabel*)[myView viewWithTag:100] text]; 

在这里,如果不是因为类型转换,你会得到一个编译器警告UIView*可能不支持[text]。much..since你将其分配给数组

在这个case..it
0

都不会有问题..

而是采取了case..where分配IBActions.to按钮,这样

- (IBAction) clickedButton:(id) sender 
现在

在您要设置按钮的α为零此功能..

你知道你的按钮将是发送者......既然你已经做了IBAction为连接到..

但如果使用

sender.alpha = 0 ; 

虽然会工作,因为这是事实,这是按钮.. 但阅读它不是best..and编译器将你送到甚至连抱怨像intvalue这样的方法..因为它是ID ..

所以你键入大小写到(UIbutton *) sender ..使编译器理解它作为一个按钮,并执行其工作。

1

(NSArray *)是投到NSArray *然而,这是不需要的,因为allObjects方法返回NSArray *

0

看起来你完全误解了指针和类型。我去过那儿。在我读了C傻瓜或smthng(尤其是指针部分)后,我明白了。这是基础知识,你必须知道C.答案是:它是类型转换。

+0

哇,这太糟糕了......但公平! - 我从来没有做过C直接进入Objective-C! – 2012-02-28 19:27:52