内存管理:
1、内存结构:
1>栈,保存局部变量,栈内存是从大到小分配空间的。
2>堆,保存OC对象,堆内存是从小到大分配空间的。
3>BSS段,保存未初始化的全局变量和静态变量。
4>数据段,保存字符串常量、初始化的全局变量、初始化的静态变量。
5>代码段,保存程序运行的代码。
6>内存地址大小依次是:代码段 < 数据段 < BSS段 < 堆 < 栈
2、内存管理的意义:因为手机内存有限,合理的使用内存,提高程序的稳定性。
3、内存的出现的问题:
1>野指针问题:当对象被销毁后,还通过指针去访问该对象。
2>内存泄漏问题:系统不自动释放OC对象占用的内存空间,当指针变量被销毁时,指针指向的对象无法释放,就会造成内存泄漏。
3、内存管理的范围:栈、BSS段、数据段、代码段都是有系统管理,所有我们只需要关心堆内存,防止堆内存的泄漏。
4、程序运行加载进内存的东西:
1>类文件,用来创建类对象。
2>全局变量和静态变量,因此尽量少定义全局变量和静态变量,加快程序的启动速度。
5、内存管理的分类:
1>MRC机制(手动内存管理)iOS4.1之前
2>ARC机制(自动引用计数)iOS4.1之后
3>garbage collection(垃圾回收),iOS不支持垃圾回收。
6、@class
1>解决的问题:类与类之间循环引用的问题,即A类是B类的成员变量,B类又是A类的成员变量。使用#import会报错(只要看见两个类中互相#import对方的头文件,就是循环引用问题)。
2>与#import区别:#import会将引用的文件内容拷贝到该语句处,@class只会告诉编译器这是个类,类中有啥,不知道。
3>@class用法:如果类的成员变量中有OC类的话,在类声明中使用@class,在类的实现中用#import,减少类声明拷贝次数,这样提高编译的效率。
4>类声明中#import使用缺点,当上百个类引入了A类的声明,此时若修改A类的声明时,这上百个类都要重新编译,大大降低了编译效率,而使用@class正好解决这问题,即使修改A类声明,上百个类也不会重新编译。项目编译完之后,项目中哪个文件再次修改,则再重新编译那个文件,其他文件不会编译。
7、OC中空的分类
1>nil,给指向OC对象的指针赋值。
2>Nil,给指向类对象的指针赋值。
3>NULL,给C语言指针赋值。
4>[NSNull null],创建了一个空对象,可以让NSArray类对象保存空,nil不能保存到NSArray中。
5>[nil runss];,使用空指针发送任何消息,都不会报错;例如
Dog *d = [Dog new];
[d run];
[d release];
[d run];// 相当于[nil run];,避免野指针的出现。 |
|