Effective Objective-C 2.0 读书笔记——类对象

news/2025/2/8 13:39:15 标签: objective-c, ios, 开发语言

Effective Objective-C 2.0 读书笔记——类对象

前言

在学习消息转发之中的动态方法解析,对如何获取实例方法列表和类方法列表有些许疑问。在使用class方法,对NSObject的实例对象使用class方法,和对NSObject直接使用class方法,得到的结果是一样的,都是获得NSObject的类对象。

NSObject *name = [NSObject new];
NSLog(@"1_%@",[name class]);
NSLog(@"2_%@",[NSObject class]);

这是为什么呢?按理来说对[NSObject class]获取的是元类对象似乎更合逻辑

其实这里[NSObject class]指的是类本身,而不是所谓的类对象。所以我们对单纯指向的一个类使用一次class方法得到的就是类对象,如果我们想要获得元类对象的话应该对其得到的类对象在进行一次class

class 调用时,无论是对实例对象还是对类本身调用,最终返回的 都是类对象(即 NSObject 的类对象)。这意味着 对实例调用 class 方法时,返回的也是该实例所属类的类对象,而不是元类对象。

类对象

说了关于类对象的引入,接下来我们要了解的是,类对象作为一个对象应该是由什么构成的呢?在具体介绍之前,书中还讲了一些基本知识。

每个Objective-C对象实例都是指向某块内存数据的指针 。所以在声明变量时,类型后面要跟一个" * *"字符,在C语言中这个星号代表着指针

NSString *pointerVariable = @"Some string";

对于通用的对象类型id,由于其本身已经是指针了,所以我们能够这样写:

 id generic rypedString= @"Somestring";

Id类型本身定义如下:

typedef struct obje_object ( 
	Class isa;
}*id:

每个对象结构体的首个成员是Class 类的变量。该变量定义了对象所属的类, 通常称为“isa” 指针。

类对象的定义如下

typedef struct objc_class {
    Class isa;                           // 类的类型指针,指向类的元类对象
    Class super_class;                   // 指向父类的指针
    const char *name;                    // 类的名字(C 字符串)
    long version;                        // 类的版本信息(通常用来做版本控制)
    long info;                           // 类的元数据,一般用于存储类的一些属性(如是否是 `Meta-Class`)
    long instance_size;                  // 类的实例大小,即实例对象占用的内存大小
    struct objc_ivar_list *ivars;        // 实例变量列表,指向一个 `objc_ivar_list` 结构体
    struct objc_method_list **methodLists; // 方法列表,指向方法表的指针
    struct objc_cache *cache;            // 方法缓存,存储常用的方法以提高性能
    struct objc_protocol_list *protocols; // 协议列表,指向协议列表
} objc_class;

关于isa指针继承链的相关内容,在刚开始接触OC的博客之中就有讲到,我们拿书中给出的图作为例子

image-20250202105802083

isMemberOfClass和isKindOfClass

1. isMemberOfClass:

  • 作用:检查对象是否严格属于某个类,不包括子类
  • 返回值:如果对象是指定类的直接实例(即不考虑继承关系),返回 YES,否则返回 NO

2. isKindOfClass:

  • 作用:检查对象是否属于某个类或其子类
  • 返回值:如果对象是指定类或该类的任何子类的实例,返回 YES,否则返回 NO

书中给出的应用

- (NSString*)commaSeparatedStringFromObjects:(NSArray*)array {
    NSMutableString *string = [NSMutableString new];  // 创建一个可变字符串用于存储结果

    for (id object in array) {
        if ([object isKindOfClass:[NSString class]]) {
            // 对于NSString类型的对象,直接将其添加到字符串中
            [string appendFormat:@"%@,", object];
        } else if ([object isKindOfClass:[NSNumber class]]) {
            // 对于NSNumber类型的对象,转化为整数并添加到字符串中
            [string appendFormat:@"%d,", [object intValue]];
        } else if ([object isKindOfClass:[NSData class]]) {
            // 对于NSData类型的对象,进行Base64编码后添加到字符串中
            NSString *base64Encoded = [object base64EncodedStringWithOptions:0];  // 假设我们有Base64编码的功能
            [string appendFormat:@"%@,", base64Encoded];
        } else {
            // 对于不支持的类型,打印错误消息
            NSLog(@"Unsupported type: %@", NSStringFromClass([object class]));
        }
    }

    // 移除字符串最后多余的逗号
    if (string.length > 0) {
        [string deleteCharactersInRange:NSMakeRange(string.length - 1, 1)];
    }

    return string;
}


http://www.niftyadmin.cn/n/5844905.html

相关文章

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

【服务器知识】如何在linux系统上搭建一个nfs

文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…

深入了解越权漏洞:概念、危害与防范

前言 越权漏洞作为一种常见且极具威胁的安全隐患,就像隐藏在暗处的 “黑客帮凶”,时刻威胁着我们的数据安全和隐私。就让我们一起揭开越权漏洞的神秘面纱,深入了解它的来龙去脉、危害以及应对之策。 一、什么是越权漏洞 想象一下&#xff0…

flutter安卓打包签名

flutter安卓打包签名 1.创建签名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一个用于管理密钥和证书的命令行工具,通常与 Java 开发工具包 (JDK) 一起使用。my-release-…

预训练语言模型(笔记)

笔记来源:Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园 预训练语言模型的发展并不是一蹴而就的,而是伴随着诸如词嵌入、序列到序列模型及 Attention 的发展而产生的。 一、…

VERA: 基于视觉-语言模型的解释性视频异常检测框架

文章目录 速览摘要01 引言1.1 关键观察与研究问题1.2 我们的方法1.3 贡献 02 相关工作2.1 视频异常检测2.2 针对VLM的语言化学习 03 VERA框架3.1 视频异常检测的任务定义3.2 在VERA中通过语言化学习寻找VAD指导性问题训练目标训练数据通过学习者与优化器更新 Q Q Q学习者与优化…

2025.2.6 数模AI智能体大更新,更专业的比赛辅导,同提示词效果优于gpt-o1/o3mini、deepseek-r1满血

本次更新重新梳理了回复逻辑规则,无任何工作流,一共3.2k字细节描述。具体效果可以看视频,同时也比对了gpt-o1、gpt-o3mini、deepseek-r1-67BI,从数学建模题目解答上来看,目前我的数模AI智能体具有明显优势。 AI智能体优…

vmware ubuntu 扩展硬盘系统文件大小

首先,在VMware中添加扩展硬盘大小: 通过lsblk指令,可以看到添加的未分配硬盘大小情况: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS fd0 2:0 1 4K 0 disk loop0 7:0 0 4K 1 loop /snap/bare/5 loop1…