NSobject官方介绍

NSObject协议组对所有的Object-C下的objects都生效。

如果objects遵从该协议,就会被看作是first-class objects(一级类)。

另外,遵从该协议的objects的retain,release,autorelease等方法也服从objects的管理和在Foundation中定义的释放方法。一些容器中的对象也可以管理这些objects,比如

NSArray NSDictionary定义的对象。

Cocoa的根类也遵循该协议,所以所有继承NSObjects的objects都有遵循该协议的特性。

 

NSObjects采用的协议:

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-proxy)Cocoa对象指定了以下的定义(interface)和特有的事件:

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

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

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

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

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


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

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

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

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

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

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


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

❏superclass和class方法(类和实例(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类声明了一些与对象编码相关的其它方法,有:classForCoder,replacementObjectForCoder:,和awakeAfterUsingCoder:。

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
struct VideoPicker: UIViewControllerRepresentable { @Environment(.presentationMode) private var presentationMode let sourceType: UIImagePickerController.SourceType // let onImagePicked: (UIImage) -> Void let onURLPicked: (URL) -> Void final class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { @Binding private var presentationMode: PresentationMode private let sourceType: UIImagePickerController.SourceType private let onURLPicked: (URL) -> Void init(presentationMode: Binding<PresentationMode>, sourceType: UIImagePickerController.SourceType, onURLPicked: @escaping (URL) -> Void) { presentationMode = presentationMode self.sourceType = sourceType self.onURLPicked = onURLPicked } func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage // onImagePicked(uiImage) if let url = info[.mediaURL] as? URL{ onURLPicked(url) } presentationMode.dismiss() } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { presentationMode.dismiss() } } func makeCoordinator() -> Coordinator { return Coordinator(presentationMode: presentationMode, sourceType: sourceType, onURLPicked: onURLPicked) } func makeUIViewController(context: UIViewControllerRepresentableContext<VideoPicker>) -> UIImagePickerController { let picker = UIImagePickerController() picker.sourceType = sourceType picker.delegate = context.coordinator picker.mediaTypes = ["public.movie"] return picker } func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<VideoPicker>) { } }这段代码获取的url中绝对路径不准确
最新发布
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值