美文网首页
iOS-浅谈OC中对象的类型

iOS-浅谈OC中对象的类型

作者: 晴天ccc | 来源:发表于2019-04-30 14:05 被阅读0次

目录

  • OC对象的类型
  • instance(实例)对象
    ----instance对象内存结构
  • Class(类)对象
    ----Class对象内存结构
  • Meta-class(元类)对象
    ---- Meta-class对象 内存结构
    ----Meta-class对象判断

OC对象的类型

Objective-C中的对象,简称OC对象,主要可以分为3种
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)

【一】instance(实例)对象

实例对象就是通过类alloc出来的对象,每次调用alloc都会产生新的实例对象。

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

object1、object2是NSObject的instance对象(实例对象) 它们是不同的两个对象分别占据着两块不同的内存(16字节)

  • instance对象内存结构

在内存中存储的信息包括:
isa指针
其他成员变量

@interface Person : NSObject {
    int _age;
}

内存结构为:


isa指针会排在所有成员变量的最前即内存首地址,所以isa指针的地址就是instance对象的地址

【二】Class(类)对象

    NSObject *obj1 = [[NSObject alloc] init];
    NSObject *obj2 = [[NSObject alloc] init];

    Class objectClass1 = obj1.class;
    Class objectClass2 = obj2.class;
    Class objectClass3 = object_getClass(obj1); // Runtime API
    Class objectClass4 = object_getClass(obj2); // Runtime API
    Class objectClass5 = [NSObject class];

    NSLog(@"%p,%p,%p,%p,%p",objectClass1,objectClass2,objectClass3,objectClass4,objectClass5);
 0x1f04def48,0x1f04def48,0x1f04def48,0x1f04def48,0x1f04def48

总结:
objectClass1~objectClass5都是NSObject的类对象,它们都是同一个对象
每个类在内存中有且只有一个class对象。

  • class对象内存结构

isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instance method)
类的协议信息(protocol)
类的成员变量信息(ivar)

【三】Meta-class(元类)对象

获取meta-class对象

Class objectMetaClass = object_getClass([NSObject class]); // Runtime API

objectMetaClassNSObjectmeta-class对象(元类对象),每个类在内存中有且只有一个meta-class对象。

  • Meta-class对象内存结构

meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的主要信息包括:
isa指针
superclass指针
类的类方法信息(class method)

object_getClass方法的实质是返回isa指针指向的内容.
所以如果传入实例对象,返回的是类对象;传入的是类对象,返回的是元类对象。
[obj class]只能返回类对象,即使调用多次也返回类对象。
objc_getClass[obj class]一样,只能返回类对象。

  • Meta-class对象判断

#import <objc/runtime.h>
// 判断NSObject是否为元类对象
BOOL result = class_isMetaClass([NSObject class])

相关文章

  • iOS-浅谈OC中对象的类型

    目录 OC对象的类型Instance对象(实例对象)----实例(instance)对象内存结构Class对象(类...

  • iOS-浅谈OC对象

    Objective-C的本质 我们平时编写的Objective-C代码底层是由C\C++实现的。OC的面向对象是基...

  • iOS-浅谈OC中的Class对象

    目录 Class对象----class的结构----class_rw_t的结构----class_ro_t的结构结...

  • iOS-浅谈OC中的关联对象

    目录 前言工作中遇到问题的思考---- 直接在分类添加成员变量---- 在分类中增加属性如何在分类中添加成员变量?...

  • OC对象类型浅析

    OC中对象类型的分类 OC中对象类型可以分为如下三类: instance 实例对象 class 类对象 meta-...

  • ARC下所有权修饰符

    oc编程中为了处理对象,可将变量类型定义为id类型或各种对象类型。 所谓对象类型就是指向NSObject这样的oc...

  • iOS-浅谈OC对象的本质

    目录 Objective-C的本质NSObject的底层实现一个NSObject对象的底层内存分布情况内存占用查看...

  • Swift与OC部分方法、类型区别与互转

    Swift与OC转换 1、获取对象类型 共有: 2、函数入参中对象转化 OC转Swift,对象变为可选类型 Swi...

  • iOS-浅谈OC中的KVO

    OC对象的类型 Objective-C中的对象,简称OC对象,主要可以分为3种 instance对象(实例对象)c...

  • Effective Objective-C 读书笔记(二) |

    Class 类型对象 OC本身是一种强类型语言,但其运行时功能让它又有了动态语言的特点。OC中对象的类型和对象所执...

网友评论

      本文标题:iOS-浅谈OC中对象的类型

      本文链接:https://www.haomeiwen.com/subject/rvxvnqtx.html