• 【Objective-C】Objective-C汇总


    很好的参考:https://www.runoob.com/w3cnote/objective-c-tutorial.html

    Objective-C:C的超集

    Objective-Objective-C是C语言的严格超集:任何C语言程序不经修改就可以直接通过Objective-C编译器
    Objective-C被描述为盖在C语言上的薄薄一层

    源代码的文件扩展名

    • .h: 头文件
    • .m: 源代码文件,更常用,可以包含 Objective-C 和 C 代码
    • .mm: 源代码文件,可以包含 Objective-C 、 C 和 C++ 代码

    #import和#include

    • 你可以使用标准的 #include 编译选项
    • #import 选项和 #include 选项完全相同,并且#import 可以确保相同的文件只会被包含一次
    • Objective-C 的例子和文档都倾向于使用 #import

    消息传递

    Objective-C里,对象之间互相传递消息。

    • C++里类别与方法的关系严格清楚,一个方法必定属于一个类别,而且在编译时(compile time)就已经紧密绑定,不可能调用一个不存在类别里的方法。
    • Objective-C里,类别与消息的关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时(runtime)才会动态决定,并交由类别自行决定如何处理收到的消息。

    类的声明

    在这里插入图片描述

    方法声明

    在这里插入图片描述

    参考:https://www.yiibai.com/objective_c/objective_c_functions.html

    Objective-C编程语言中方法定义的一般形式如下

    - (return_type) method_name:( argumentType1 )argumentName1 
        joiningArgument2:( argumentType2 )argumentName2 ... 
        joiningArgumentn:( argumentTypen )argumentNamen {
        body of the function
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例:

    /* 返回两个参数的最大值 */
    - (int) max:(int) num1 secondNumber:(int) num2 {
    
       /* 局部变量声明 */
       int result;
    
       if (num1 > num2) {
          result = num1;
       } else {
          result = num2;
       }
    
       return result; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法调用

    [object method] 调用object对象的method方法
    对象具备了方法,程序员就可以发出指令 [object method],让一个对象去执行它的方法,也就是“调用对象的方法”。
    在 Objective-C语言里,方法和实现的关系不是在编译时决定的,而是在运行时决定的。

    举例:

    - (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 声明方法*/
    
    [myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 调用方法*/
    
    • 1
    • 2
    • 3

    协议

    协议是一组没有实现的方法列表,类似Java中的"接口"
    任何类都可以声明自身实现了某个协议

    非正式协议与正式协议

    • 非正式协议已经被废弃不再使用
    • 正式协议中,一个类必须 实现它声明匹配的协议中的所有方法,否则编译器会报错

    协议的语法

    @protocol起始,@end结束,中间为方法列表

    @protocol Locking
    - (void)lock;
    - (void)unlock;
    @end
    
    • 1
    • 2
    • 3
    • 4

    Delegate 委托机制

    alloc 方法

    OC中经常使用 NSObject *object = [[NSObject alloc] init]; 这行代码去创建一个对象

    通过对alloc底层源码的分析, 可以了解到:
    ① alloc的主要目的是开辟内存空间;
    ② 主要的核心逻辑是 计算内存大小->申请内存空间->绑定isa;
    ③ 计算内存大小是按照16字节对齐的。

    参考:https://www.cnblogs.com/mysweetAngleBaby/p/16747295.html

    objc_msgSend

    比如

    objc_msgSend(v6, "addScriptMessageHandler:name:", self, CFSTR("windmill"));
    
    • 1

    含义是调用v6这个对象的addScriptMessageHandler:name:方法,方法的参数1是self,参数2是CFSTR("windmill")

    根据addScriptMessageHandler:name:方法的定义:

    (void)addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
    
    • 1

    addScriptMessageHandler:name: 是 WKUserContentController 类的一个实例方法

    • 参数1的类型是id,参数名是scriptMessageHandler,形参名称省略(第一个参数可以没有形参名称,后面的参数必须有形参名称)
    • 参数2的类型是NSString *,参数名是name,形参名称是name

    IDA反编译看到的代码

    bool __cdecl -[SpotifyAppDelegate application:openURL:options:](
            _TtC24MusicApp_ContainerWiring18SpotifyAppDelegate *self,
            SEL a2,
            id a3,
            id a4,
            id a5)
    {
    	……
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • bool是返回值类型
    • __cdecl 是一种函数调用约定(calling convention),指定由调用者负责清理堆栈
    • - 表示是对象方法
    • SpotifyAppDelegate是一个类,是该方法所属的类
    • application:openURL:options:是方法签名
      • application是方法名称
      • openURL是参数2的形参名称
      • options是参数3的形参名称
    • ( _TtC24MusicApp_ContainerWiring18SpotifyAppDelegate *self, SEL a2, id a3, id a4, id a5)是方法的参数。每个参数都有一个类型和一个名称,用于在方法的实现中引用和操作这些参数。
      • _TtC24MusicApp_ContainerWiring18SpotifyAppDelegate *self: 一个指向SpotifyAppDelegate对象的指针,表示方法的调用者。
      • SEL a2: 一个选择器(Selector),表示方法的方法名。
      • id a3, id a4, id a5: 这些是真正的参数,id类型,可以表示任意类型的对象。

    该方法对应的方法签名是- (bool)application: (UIApplication *)application openURL: (NSURL *)url options: (NSDictionary *)options
    所以:

    • id a3 对应的是参数1 application
    • id a4对应的是参数2 url
    • id a5对应的是参数3 options
  • 相关阅读:
    阿贵的晚餐
    基于JAVA校园教务排课系统(Springboot框架) 开题报告
    使用dispatchEvent解决重叠元素响应事件问题
    Web前端—移动Web第三天(移动Web基础、rem、less、综合案例—极速问诊)
    【MATLAB源码-第59期】基于matlab的QPSK,16QAM164QAM等调制方式误码率对比,调制解调函数均是手动实现未调用内置函数。
    【7.31】代码源 - 【矩阵操作】【宝箱】【New Stone Game】【等差数列】
    昨参观宋庆龄故居
    CST--如何在PCB三维模型中自由创建离散端口
    深入学习Redis,结合实际工作经验总结常用核心知识点
    关于保存和恢复 View 层次结构,系统的工作流程是这样的
  • 原文地址:https://blog.csdn.net/qq_39441603/article/details/134296627