Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • iOS 学习开发指南
  • 调研

  • 其他

    • iOS术语
    • swift语法
    • oc语法
    • 原理
      • 其他
        • 【iOS】运行时消息传递与转发机制
        • runtime
        • UITableView 刷新原理
      • 链接
    • 项目构建
    • iPhone技巧
    • ui
    • pod
    • xcode的使用
  • 《iOS》
  • 其他
Jacky
2023-10-09
目录

原理

# 其他

# 【iOS】运行时消息传递与转发机制

Objective-C 是一门非常动态的语言, 以至于确定调用哪个方法被推迟到了运行时, 而非编译时。与之相反, C 语言使用静态绑定, 也就是说, 在编译期就能决定程序运行时所应该调用的函数, 所以在 C 语言中, 如果某个函数没有实现, 编译时是不能通过的。而 Objective-C 是相对动态的语言, 运行时还可以向类中动态添加方法, 所以编译时并不能确定方法到底有没有对应的实现, 编译器在编译期间也就不能报错。 更多内容参考 (opens new window)

具体的来说:

在 Objective-C 中, 如果一个类声明遵循某个协议(protocol), 而没有提供协议中的某个方法的实现, 编译器通常不会报错。这是因为 Objective-C 的动态性质使得在运行时有更多的灵活性。在运行时, 如果某个对象实现了遵循的协议, 但没有提供协议中的某个方法的实现, 那么在调用该方法时会导致运行时错误(通常是崩溃)

所以, 与 C 语言不同, Objective-C 的编译器不会在编译期强制要求协议中的方法一定要被实现。这就需要开发者在代码中自行确保对象遵循的协议中的方法都有合适的实现。这也是为什么在 Objective-C 中通常会使用 @optional 关键字来标记协议中的方法为可选的。使用 @optional 关键字后, 编译器不会强制要求实现这些方法

然而, 对于某些协议, 如果某个方法是强制必须实现的, 可以在协议中使用 @required 关键字标记, 以确保类遵循该协议时必须提供方法的实现。这样, 如果某个类没有提供必需的实现, 编译器会发出警告

总结: 在 Objective-C 中, 协议方法是否必须实现主要取决于协议定义时是否使用 @required 或 @optional 关键字来明确规定, 而编译器通常不会在编译期报告缺少实现的警告或错误。编译器会在运行时检查方法是否被实现, 如果没有实现, 会导致运行时错误

# runtime

动态替换方法

示例代码:

Class buttonClass = self;
SEL oriSel = @selector(sendAction:to:forEvent:);
Method oriMethod = class_getInstanceMethod(buttonClass, oriSel);

SEL mySel = @selector(mySendAction:to:forEvent:);
Method myMethod = class_getInstanceMethod(buttonClass, mySel);

BOOL isAdd = class_addMethod(buttonClass, oriSel, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));

if (isAdd) {
    class_replaceMethod(buttonClass, mySel, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));
} else {
    method_exchangeImplementations(oriMethod, myMethod);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

上述代码是对 UIButton 类的方法进行交换, 将 sendAction:to:forEvent:替换成 mySendAction:to:forEvent:。当按钮被点击时, 实际上调用了 mySendAction 方法, 其中可以控制按钮的点击行为。这种方法交换的方式可以用于在不修改原有代码的情况下, 增加按钮点击的控制逻辑


# UITableView 刷新原理

TODO: 绑定数据源

通常, UITableView 中刷新的方法是 reloadData 和 reloadRowsAtIndexPaths:withRowAnimation:。以下是关于 UITableView 刷新的基本原理:

  1. 数据源和委托对象: UITableView 使用数据源和委托对象来获取表格视图的数据和控制其行为。数据源通常是一个对象, 负责提供表格视图所需的数据, 如行数、每行的内容等。委托对象则负责响应用户交互事件, 如选中行、滚动等

  2. 刷新数据源: 当你的应用程序中的数据发生变化时, 你需要相应地更新数据源。这可以是数组、字典或任何用于存储表格数据的数据结构

  3. 刷新表格视图: 要刷新表格视图以反映数据源的更改, 你可以调用 reloadData 方法。这将导致表格视图重新加载并重新绘制所有的行和部分

[self.tableView reloadData];
1
  1. 刷新指定行: 如果只需要刷新特定行或行范围, 可以使用 reloadRowsAtIndexPaths:withRowAnimation: 方法。这个方法允许你指定要刷新的行的索引路径, 还可以指定刷新时的动画效果
NSIndexPath *indexPathToReload = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView reloadRowsAtIndexPaths:@[indexPathToReload] withRowAnimation:UITableViewRowAnimationAutomatic];
1
2
  1. 动画效果: reloadRowsAtIndexPaths:withRowAnimation: 方法中的 withRowAnimation 参数允许你指定刷新时的动画效果。这些效果包括渐变、上下滑动等, 以使刷新更加平滑和可视化

总的来说, UITableView 的刷新机制是通过数据源提供数据, 然后通过调用相关方法来通知表格视图进行更新。这允许你在应用程序中的数据发生变化时, 以一种有序和可控的方式更新表格视图, 以便用户能够看到最新的数据

# 链接

  • iOS View Controller Life Cycle (opens new window)
上次更新: 2024/12/01, 17:07:39
oc语法
项目构建

← oc语法 项目构建→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式