block
一、前期准备知识
1.1 堆与栈基本概念
1.2 终端与clang编译常用命令
1.1 堆与栈简介:
栈区(stack)
- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区(heap)
- 般由程序员分配释放,若程序员不释放,程序结束时可能由OS(即操作系统)回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
例子:
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456/0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
除此之外还有全局区、文字常量区、程序代码区。具体见这篇文章堆和栈的区别(转过无数次的文章)
这里就不扩展开了。
1.2 终端与clang编译常用命令
1.2.1 终端打开方式:
`LaunchPad -> 其他 -> 终端`
1.2.2 clang编译常用命令
(1) Clang重写m文件为cpp文件
cd 到工程目录然后输入
clang -rewrite-objc xxxx.m
然后你目录下就会从写一个cpp文件,内容比较多你可以搜索关键方法对照查看。
详细的clang编译介绍可以看下这篇文章深入剖析 iOS 编译 Clang / LLVM
注意事项
block 官方介绍
Block在MRC及ARC下的内存管理
iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- 在Block的内存存储在栈中时,如果在Block中引用了外面的对象,不会对所引用的对象进行任何操作
- 如果对Block进行一次copy操作,那么Block的内存会被移动到堆中,这时需要开发人员对其进行release操作来管理内存
- 如果对Block进行一次copy操作,那么Block的内存会被移动到堆中,在Block的内存存储在堆中时,如果在Block中引用了外面的对象,会对所引用的对象进行一次retain操作,即使在Block自身调用了release操作之后,Block也不会对所引用的对象进行一次release操作,这时会造成内存泄漏。
处理方法:
- 如果对象内部有一个Block属性,而在Block内部又访问了该对象,那么会造成循环引用,解决循环引用的办法是在对象的前面使用下划线下划线block来修饰,以避免Block对对象进行retain操作
参考文献:
Blocks Programming Topics
A Short Practical Guide to Blocks