-
Notifications
You must be signed in to change notification settings - Fork 105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
内存管理 #38
Comments
延伸阅读
计算机基础知识
|
造成内存泄漏的几种常见原因
参考: |
内存管理总结(《Objective-C高级编程》学习总结)目录一、内存管理简介
二、 iOS 的内存管理和手动引用计数
三、ARC
四、ARC 的实现 ⭐️
五、实践
|
二、 iOS 的内存管理和手动引用计数(非 ARC)1. 引用计数内存管理简介当创建一个对象的实例并在堆上申请内存时,对象的引用计数就为1,在其他对象中需要持有这个对象时,就需要把该对象的引用计数加1,需要释放一个对象时,就将该对象的引用计数减1,直至对象的引用计数为0,对象的内存会被立刻释放。 示例代码: NSObject* obj = [[NSObject alloc] init]; //obj retain count is 1
obj = [obj1 retain]; //obj retain count is 2
[obj release]; //obj retain count is 1
[obj release]; //obj retain count is 0, obj was released 参考: 2. 引用计数内存管理的规则几个规则(结合书中的示例代码看):
对象操作与对应的 Objective-C 方法:
3.
|
三、ARC 内存管理1. ARC 简介(1)什么是 ARC?ARC 和非 ARC 的区别是什么?
实际上,虽然我们在 ARC 下不用写 retain,release 这些代码了,但是引用计数管理内存的本质在 ARC 中并没有发生变化,就像 ARC(Automatic Reference Counting)和 MRR(manual retain-release)在名字上的差别一样,ARC 只不过把引用计数的操作变得自动化了——ARC在我们编译程序时自动在需要的地方加上了内存管理的代码(retain、release、autorelease)。 (2)ARC 与非 ARC 的混编ARC中ARC 只是在编译层做手脚,所以我们可以对整个项目设置 ARC 有效或者无效,也可以针对单个文件设置 ARC 有效或无效:
(3)内存管理法则(与非 ARC 中一样,只不过在代码表现上不一样)
2. 所有权修饰符ARC 模式下,对象类型和 C 语言基本类型不同,对象类型前必须声明所有权修饰符:
(1)
|
属性声明的修饰符 | 所有权修饰符 |
---|---|
assign |
__unsafe_unretained |
copy |
__strong (但是赋值的是被复制的对象) |
retain |
__strong |
strong |
__strong |
unsafe_unretained |
__unsafe_unretained |
weak |
__weak |
参考:
- 《Objective-C 高级编程》
- iOS ARC 内存管理要点 (推荐阅读,总结的很好)
- Memory Management Programming Guide for Core Foundation
- Toll-Free Bridged Types
四、ARC 的实现(一)苹果官方声称,ARC 是“由编译器进行内存管理”的,但是实际上只有编译器是无法完全胜任的,在此基础上还需要 Objective-C 运行时库的支持。 也就是说,ARC 由以下工具、库来实现:
如果没有运行时库的支持,无论怎样静态链接用于 ARC 的库,都无法实现在对象废弃时将所有引用它的 在 LLVM 的文档 Objective-C Automatic Reference Counting (ARC) — Clang 13 documentation 中,也可以看到关于编译层面实现 ARC 更详细的描述。 1.
|
四、ARC 的实现(二)2.
|
四、ARC 的实现(三)3.
|
关联主题
The text was updated successfully, but these errors were encountered: