什么是NSObject

 

来了优快云很久了没载入过什么东西。

传点有用的东西供交流

本文英文版权为苹果(apple)所有。

 

本文为中文工作中翻译,仅上传部分,仅供查阅交流,请勿转载。

All Rights Reserved

 

NSObject

NSObject是大多数Objective-C类的继承的根类;它没有父类。通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。

尽管NSObject不是一个严格的抽象类,实际上它已经是一个类。但是通过它自己一个除了表现为一个简单类之外,NSObject实际上几乎无法完成任何有用的操作。为你的程序添加任何属性(attributes)并制定实现逻辑,你必须创建一个或者多个从NSObject继承或者父类从NSObject继承的类(class)。

NSObject采用(adopts,或者说是继承实现)了NSObject协议(protocol)(见“Root Class—and Protocol”(第67页) ) 。NSObject协议(protocol)允许被多个根类(root class)采用,比如NSProxy另一根类(root class),并不是从NSObject继承,但却也采用了NSObject协议(protocol)所以它在Objective-C中便有了和NSObject类相似部分的类的定义(interface)和功能。

 

NSObject根类,和采用了NSObject协议或者其它根类协议(“root” protocols)一道,为所有的非代理(non-proxyCocoa对象指定了以下的定义(interface)和特有的事件:

Allocation, initialization, duplication。一些NSObject方法(包括一些采用的协议)用来处理创建(creation),初始化(initialization)和复制(duplication)对象。

allocallocWithZone:方法在内存中为一个对象分配了内存空间并且设置它指向的对象的编译器类定义(即是告诉编译器定义了一个类,译者注)。

init方法为对象的属性初始化(prototype),一个让实例变量初始化状态的进程。类方法中的initializeload让一个类有机会初始化它们自己。

new一种方便的结合分配内存和初始化的方法。

copycopyWithZone:方法复制任意对象的内存的实现方法(从NSCopying协议来的);mutableCopymutableCopyWithZone:(在NSMutableCopying协议中定义)将被应用于(mplemented by)该类来完成不定的对象拷贝(make mutable copies of their objects)。

“Object Creation” (页77 )以获取更多信息。

Objectretention and disposa(对象的保留和释放)。接下来的方法对于面向对象的程序尤其的重要,那就是如何传统的,明确的,形式化的(traditional, and explicit,form)实现内存管理。

retain方法,增加对象的计数器。

release方法,减少对象的计数器

autorelease方法,自动减少对象的计数器,但是以推迟的方式来实现。

retainCount方法,返回一个对象当前的计数器

dealloc方法应用于类来释放对象实例变量并释放动态内存。

参见“How Memory Management Works” (页73)来了解更多有关明确关于内存管理的信息。

Introspection comparison(反省机制和对比机制).许多NSObject方法使你能够让编译器查询一个对象。反省方法(introspection methods)帮助你探查一个对象在类继承机制中的位置,决定是否实现一些方法,并测试它是否遵循一些协议。而一些类仅是有一些方法。

superclassclass方法(类和实例(class and instance))分别返回接收器的父类和类,作为一个Class对象。

isKindOfClass:isMemberOfClass:,通过这两种方法可以确定一个类的从属关系。后者测试一个接收器是否是一个指定类的实例;而后者可以测试类的从属关系。

respondsToSelector: 方法测试一个接收器是否通过selector实现(implements)了一个标志符话的方法。而instancesRespondToSelector:测试了一个给定的类实例化之后(这个消息的接收方法为静态方法,译者注)是否实现了一个指定的方法。

conformsToProtocol:方法,测试接收器(对象或者类)符合一个给定的协议(protocol)。

isEqual: hash方法,用于对象比较。

description方法,允许一个对象返回一个字符串来描述它的内容;这个常用于调试debugging (“print  object”命令 ) 。通过“%@”以字符串输出特殊的指定对象。(即是以NSLog的形式输出,译者注)

参见“Introspection”(页87)以获取更多的信息

       Object encoding and decoding(对象的编码和解码).接下来的方法将与对象的编码和解码方式有关 (作为一个归档处理的一部分):

encodeWithCoder: initWithCoder:方法,NSCoding协议中仅有的组成成员。第一个允许对象编译它的实例变量,第二个允许一个对象初始化它自身的解码实例变量。

NSObject类声明了一些与对象编码相关的其它方法,有:classForCoderreplacementObjectForCoder:,和awakeAfterUsingCoder:

    参阅Archives and SerializationsProgramming Guide for Cocoa来获取更多的信息。

    Message forwarding(消息转发). forwardInvocation:允许一个对象把消息转发给另一个对象。

    Message dispatch(消息配送). 一个以performSelector...为开头的方法允许你配送消息(message)直到指定的延迟后,并且可以从二级线程((synchronously or asynchronously)同步或者不同步地)配送消息到主线程。

       NSObject拥有许多其它的方法,比如版本和传递的类方法(class methods for versioning and posing)(之后将为你展示如何将一个类本身编译为另一个类)。它既包括了方法让你访问编译器数据结构的类,比如selector方法和函数指针形式的方法实现。

 

更多技术交流请联系281516823

 

### 如何在 Swift 中使用 `NSObject` 类 #### 继承自 `NSObject` 为了使 Swift 的类能够兼容 Objective-C 运行时环境,通常会继承自 `NSObject` 或者其他间接继承自 `NSObject` 的类。这样做可以让该类的方法和属性自动带有 `@objc` 属性,从而可以在 Objective-C 代码中调用这些方法或访问这些属性。 ```swift class MyCustomClass: NSObject { var name: String init(name: String) { self.name = name } override var description: String { return "MyCustomClass with name \(name)" } } ``` 通过上述方式定义的类可以直接用于 KVO (键值观察), 并且可以方便地与基于 Cocoa Touch 和 AppKit 构建的应用程序框架交互[^1]。 #### 使用 `@objc` 关键字控制可见性 虽然当一个 Swift 类继承自 `NSObject` 后其成员会被隐式地标记为 `@objc`, 不过这可能会导致不必要的性能开销以及增大应用程序包体积。因此,在实际开发过程中应当谨慎考虑哪些部分确实需要暴露给 Objective-C, 只对必要的接口应用此标记: ```swift class AnotherClass: NSObject { @objc private(set) dynamic var observableProperty: Int = 0 // 此函数不会被暴露给Objective-C func internalMethod() {} } ``` 这里需要注意的是即使某个变量声明了 `dynamic` 来支持KVC/KVO机制,但如果它没有显式标注 `@objc` 那么也不会成为ObjC运行时的一部分。 #### 实现协议并遵循 `AnyObject` 除了直接继承 `NSObject` 外,还可以让自己的类去遵从某些特定类型的协议来达到相同的效果。因为所有引用类型(即类实例)都可以视为实现了 `AnyObject` 协议的对象,所以只要确保所使用的协议仅限于此类即可: ```swift protocol SomeProtocol: AnyObject { func doSomething() } // 下面这个类既可以作为纯Swift对象也可以桥接到OC端使用 class YetAnotherClass: NSObject, SomeProtocol { func doSomething() { print("Doing something...") } } ``` 这种做法不仅保持了良好的封装性和灵活性,还允许开发者更好地管理跨平台间的互操作性问题[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值