Objective-C id 和 NSObject

标签 objective-c object nsobject

我知道 id 适用于任何对象类型,甚至是不继承 NSObject 的对象,例如来自 Cocoa 的对象。我被告知几乎总是使用 id,但是如果我正在制作一个 API 并且有一个方法我想明确表示它应该只接受某种类型的对象,比如一个叫做 Animal 的对象,我还会使用吗

(id) animal

还是我会做

(Animal) animal

非常感谢!

最佳答案

id 是一个指向对象的通用指针——类似于 void *,除了指针必须指向一个 Objective-C目的。所以是的,您可以在大多数更具体的对象指针类型可以工作的情况下使用 id,但通常最好使用更具体的类型:

- (id)animal;  // OK if 'animal' could be any type of object
- (Animal*)animal; // much better if you know that 'animal' points to an object of type 'Animal'

如果您查看任何 Cocoa 或 Cocoa Touch 类,您会发现大量示例。让我们看一点UIView :

- (BOOL)isDescendantOfView:(UIView *)view;  // returns YES for self.
- (UIView *)viewWithTag:(NSInteger)tag;     // recursive search. includes self

如您所见,第一个方法将 UIView* 作为参数。如果您尝试传递指向 UIView 实例的指针以外的其他内容,编译器会报错。

第二个方法返回一个UIView*,你可以直接使用这个结果作为UIView理解的其他消息的接收者:

[[topView viewWithTag:someTag] removeFromSuperview];

具体说明参数类型和返回值可让编译器帮助您确保向对象发送适当的消息并获取适当的值。

关于Objective-C id 和 NSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998713/

相关文章:

objective-c - 从头开始重新实现 NSObject

objective-c - NSObject init 方法有什么作用吗?

objective-c - 如何在 Objective-C 中创建 Swift 对象?

objective-c - IBOutlets 可以在 App Delegate 中使用来访问文档窗口吗?

ios - 如何显示时间 08 :00:00 to 8 am using swift

javascript - 更好的嵌套对象引用语法?

java - 等效静态和非静态方法的速度差异很大

objective-c - 错误: @"Bridge module %@ does not conform to RCTBridgeModule"

objective-c - 调用 popToRootViewController 动画导致崩溃。我应该怎么做?

javascript - 如果来自对象的相同键添加值