我之前曾问过这个问题......
Understanding memory management in ios
这一问题没有告诉我的一件事是(NSArray *)
在以下陈述中做了什么:
NSArray *myArray = (NSArray *)[someNSSet allObjects];
为什么不是这样:
NSArray *myArray = [someNSSet allObjects];
或者换句话说,这两个陈述在他们的工作中有何不同?目前我不理解(NSArray *)
位,所以我只是忽略它,对我来说它们看起来一样!
提前致谢
答案 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.答案是:它是强制性的。