zoukankan      html  css  js  c++  java
  • Cocoa-Cocoa对象

    2、Cocoa对象

    2.1 Objective-C是面向对象的语言

    Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。

    2.2 Objective-C的优点

    Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:

    动态类-运行时确定类的对象

    动态绑定-运行时确定要调用的方法

    动态加载--运行时为程序加载新的模块

    2.3 动态能力相关的isa指针

    每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object  记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

    那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

    [cpp] view plaincopy

    1. @interface NSObject <NSObject> {  

    2.      Class    isa;  

    3. }   

    不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

    [cpp] view plaincopy

    1. struct NSObject{  

    2.    Class isa;  

    3.  }  

    Class是用typedef 定义的

    [cpp] view plaincopy

    1. typedef struct objc_class *Class;  

    那NSObject可以这么写了

    [cpp] view plaincopy

    1. struct NSObject{  

    2.   objc_class *isa  

    3. }  

    那objc_class的结构是什么样的呢?大概是这样的:

    [cpp] view plaincopy

    1. struct objc_class {  

    2.      Class isa;  

    3.        

    4.      Class super_class;  

    5.        

    6.      const char *name;  

    7.        

    8.      long version;  

    9.      long info;  

    10.        

    11.      long instance_size;  

    12.      struct objc_ivar_list *ivars;  

    13.      struct objc_method_list **methodLists;   

    14.        

    15.      struct objc_cache *cache;  

    16.      struct objc_protocol_list *protocols;     

    17.  }  

    这里会看到,在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。

       为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语

    图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。

    图中的箭头都是指针的指向。

    2.4 根类 NSObject

    NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。

    2.4.1 根类和根类协议

    NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议 , NSObject协议指定了根类必须实现的接口。

    2.4.2 根类的主要方法:

    •     分配、初始化、和复制:

    alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。
    init方法是对象初始化。
    new是一个将简单的内存分配和初始化结合起来的方法。
    copy和copyWithZone:

    • 对象的保持和清理:

    retain方法增加对象的保持次数。
    release方法减少对象的保持次数。
    autorelease方法也是减少对象的保持次数,但是以推迟的方式。
    retainCount方法返回对当前的保持次数。
    dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。

    • 内省和比较

    NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法 
    superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。
    您可以通过isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。
    respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。
    conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。
    isEqual:和hash方法用于对象的比较。
    description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。

    • 对象的编码和解码

    下面的方法和对象的编解码(作为归档过程的一部分)有关:
    encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。
    NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

    • 消息的转发

     forwardInvocation:允许一个对象将消息转发给另一个对象。

    • 消息的派发 

    在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。

    2.5 Cocoa对象生命周期

    对象的四种内存管理方式,如下图所示

    •  对象的生命周期—简化视图

    • 保持接收到的对象

    • 拷贝接收到的对象

    • 自动释放池

     转载自:

    https://my.oschina.net/tonychb/blog/417594#comment-list

  • 相关阅读:
    编程入门之结构体
    编程入门之函数理解
    编程入门之编码风格
    Linux基础 30分钟GDB调试快速突破
    GDB实战
    linux下终端游戏
    DSP学习教程基于28335(一)
    Linux内核模块编程可以使用的内核组件
    Windows10下配置Linux下C语言开发环境
    Git常规配置与基本用法
  • 原文地址:https://www.cnblogs.com/AnnieBabygn/p/7873058.html
Copyright © 2011-2022 走看看