对于Objective-C大师:
假设我有一个简单的方法:
-(id)getValue{ return [NSNumber numberWithDouble:5.0]; }
Run Code Online (Sandbox Code Playgroud)
现在,假设在其他方法中我调用(id)getValue方法,如下所示:
NSNumber* myValue = [self getValue];
Run Code Online (Sandbox Code Playgroud)
或者如果我这样称呼它:
NSNumber* myValue = (NSNumber*)[self getValue];
Run Code Online (Sandbox Code Playgroud)
问题是:显然这些线条是等效的,但其中一条线条使用了明确的演员阵容.那么这样做的正确或最佳实践方式是什么.它接触到我的演员是不必要的,因为当它被放置在指针myValue时,它在这一点上将是类型安全的(这是我想要的东西)所以演员基本没有意义.
我要补充一点,我相信人们会指出:你为什么不从getValue方法返回(NSNumber*),但在我的情况下,我希望能够灵活地返回我想要的内容,就像内置的NSDictionary当您调用objectForKey时,class返回id,因为它允许您在其中放置任何类型的NSObject或子类.换句话说,我的getValue方法并不总是返回NSNumber.还要考虑这个例子是设计的,因为我只关心是否要施放.
先感谢您,
-Ralph
转换对象的唯一原因是让编译器满意.(有时它也有助于提高可读性.)例如,当你从一个数组或字典中获取的对象上直接进行属性访问时,你必须进行强制转换:
((Foo *)[myArray objectAtIndex:0]).bar;
Run Code Online (Sandbox Code Playgroud)
如果你不进行强制转换,编译器就无法进行属性查找,并会抱怨.
当您从返回的方法中获取对象时id,编译器无法知道其实际类型是什么.没有任何"类型安全",因为它id是一个通用指针; 所有编译器可以并且将强制执行的是该方法说它返回一些Objective-C对象.非常高兴为任何类型指针分配一个通用指针.*(显然,这对于容器来说实际上是一个优势.)因为你所分配的变量的类型已经记录了实际的返回类型,我会说没有必要演员.
顺便说一句,你不应该打电话给你的方法getX.这在Cocoa中具有特定的含义; "获取"某些东西的方法在指向指针的指针中传递,然后由该方法填充.见-[NSArray getObjects:range:],例如,
*当然,类型将在运行时强制执行,即发送对象未响应的消息将导致错误.
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |