(anObject *)在语句之前做了什么?

时间:2012-02-28 19:09:32

标签: iphone objective-c ios

  

可能重复:
  what is this weird code notation mean

我之前曾问过这个问题......

Understanding memory management in ios

这一问题没有告诉我的一件事是(NSArray *)在以下陈述中做了什么:

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

为什么不是这样:

NSArray *myArray = [someNSSet allObjects];
或者换句话说,这两个陈述在他们的工作中有何不同?目前我不理解(NSArray *)位,所以我只是忽略它,对我来说它们看起来一样!

提前致谢

6 个答案:

答案 0 :(得分:3)

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

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

†关于转换的注意事项:当您转换包含所有Objective-C对象类型的指针时,实际上并没有更改指针引用的东西的类型,只有指针本身。因此,您不能以这种方式将一种类型的对象更改为另一种。如果你将NSString*强制转换为NSDictionary*,那么该对象仍然是一个NSString - 你只是向编译器撒谎,所以当你试图调用时{{1}它不会警告你而且你的程序会在运行时爆炸。

答案 1 :(得分:1)

这是一个类型陈述。在简单赋值的情况下,它是无关紧要的 - Objective C允许您将无类型对象ref(id)分配给任何类型变量。但无论如何,人们都会用C / C ++惯性来编写它们。

有时它是必需的。例如:

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

此处,如果不是针对类型转换,则会收到编译器警告,UIView*可能不支持[text]

答案 2 :(得分:1)

(NSArray *)是对NSArray *的强制转换,但由于allObjects方法返回NSArray *,因此不需要它。

答案 3 :(得分:0)

这是一个类型演员。在上面的例子中,没有必要,因为[someNSSet allObjects];无论如何返回NSArray*,但是你需要在任何需要指定对象类型的地方(通常来自id),所以编译器知道实际生成什么方法调用。

答案 4 :(得分:0)

在这种情况下......因为你将它分配给一个数组而没有多大意义..

但是拿一个案例..你可以像这样分配IBActions.to按钮

- (IBAction) clickedButton:(id) sender 

现在在此功能中你想将按钮alpha设置为零..

你知道你的按钮将是发送者......因为你已经完成了与那个的IBaction连接..

但是如果你使用

 sender.alpha = 0 ; 

虽然它会起作用,因为它确实是按钮.. 但是对于阅读它并不是最好的...即使你向它发送了一个类似intvalue的方法,编译器也不会抱怨...因为它是id ..

所以你将它输入(UIbutton *) sender ..以使编译器将其理解为一个按钮并执行其工作。

答案 5 :(得分:0)

看起来你完全误解了指针和类型。我去过那儿。在我读了C的假人或smthng(特别是指针部分)后,我明白了。这是基础知识,你必须知道C.答案是:它是强制性的。