NSObject介绍

Objective-C中大多数的类都继承于NSObject,了解NSObject对于深入学习Objective-C及开发有很大的帮助。

Cocoa有两个NSObject,一个是类,一个是协议。那么它们具体是什么样子的?

命名空间:

首先,我们看看这两个有着相同命名的部分是怎么共处的。在Objective-c中,类和协议分别存在于不同的命名空间。类和协议拥有相同的命名 ,但是跟语言层级无关。这就是NSObject。

如果你光看语句,这里没有什么不同。 类命名可以用在目标的消息发送,在@interface的声明部分,作为类型名。协议也可以用在同样的地方,但 是用不同的方式。所以再没有比相同名字更容易让人混淆的了。

根类

NSObject类是根类,在所有类的最高层级,所以没有更高层的类了。Objective-c可以有多个根类,不像Java只有一个。

Java只有一个根类:java.lang.Object,其他所有的类都直接或间接的继承于它。所以Java代码可以依据任何对象来实现java.lang.Object的基本方法。

Cocoa有多个根类。除了NSObject还有NSProxy和其它等级的根类。这只是部分原因,NSObject协议定义了一套基础方法,所有的根类都可以去实现。这样,编码时就容易找到这些方法了。

NSObject类符合NSObject协议,这就是说,NSObject类实现了下面这些基础方法:

  1. @interface NSObject <NSObject> 

NSProxy同样符合NSObject协议:

  1. @interface NSProxy <NSObject> 

NSObject协议包含了hash,isEqual:,description等方法。事实上,NSProxy遵循NSObject协议意味着你可以依靠实现NSProxy来实现NSObject方法。

顺便说说Proxy

既然我们说到这里,为什么这里有一个NSProxy作为根类?

很多情况下去拥有一个类而不实现太多的方法会很有用。作为命名的建议,proxy对象就是这样的情况。NSObject类实现了比NSObject协议更多的东西,比如键值编码,你不需要它。

当建立proxy对象,通常是为了留给大多数未实现的方法,所以他们就可以使用一个forwardInvocation:方法来转发。把NSObject作为子类则可能会引入更多包,那样将会冲突。而NSProxy可以避免,因为提供了一个简单的超类,所以不会有多余的东西在里面。

协议

实际上,NSObject协议是一个很好的根协议,并不全表现在Objective-c编程上,因为我们并不经常使用其他的根类。然而,它在我们创建自己协议的时候很使用。比如,你的协议可能是这样写的:

  1.  @protocol MyProtocol 
  2. - (  void )foo; 
  3.  
  4. @end 

同时,你定义一个类指针:

  1. id<MyProtocol> obj; 

你可以这样调用foo:

  1. [obj foo]; 

当然,你不能这样使用description:

  1. [obj description];  // no such method in the protocol  

同样,你也不能这样检测相等:

  1. [obj isEqual: obj2];  // no such method in the protocol  

总的来说,你不能要求它来做一般对象做的事情。有时这没关系,但是有时又需要实现这些。这就是为什么要引进NSObject协议。协议可以继承于协议。你可以使MyProtocol继承于NSObject协议,像这样:

  1. @protocol MyProtocol <NSObject> 
  2. - (  void )foo; 
  3. @end 

这就是说不仅仅对象遵循MyProtocol协议并响应-foo,而且响应所有在NSObject协议中所有类似的消息。因此你应用中所有的对象都继承于NSObject类并且遵循NSObject协议,这样在实现MyProtocol时不需要更多的条件,同时允许你在实例中使用这些相同的方法实例。

总结

frameworks框架中有两个不同的NSObject确实比较奇怪,但是当你理解了它会非常有用。一个NSObject协议允许多个根类拥有相同的基础方法。同时,对象可以很容易去声明一个包含相同基础功能协议。NSObject类遵循了NSObject协议,把所有的东西融合到一起。

内容转载自:http://www.350351.com/bianchengyuyan/Objective_c/896_2.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值