黑马程序员复习-重点之内存管理
来源:互联网 发布:淘宝店如何更改类目 编辑:程序博客网 时间:2024/06/09 13:39
@class和循环retain
1.@class
使用场景
对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类
这种代码编译会报错。当使用@class在两个类相互声明,就不会出现编译报错
用法概括
使用 @class 类名; 就可以引用一个类,说明一下它是一个类
和#import的区别
#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了
在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类
2.循环retain
解决方案
当两端互相引用时,应该一端用retain、一端用assign
内存管理--autorelease
1. 半自动释放(其实就是当大括号内的代码块运行完后,系统让释放池内的对象自动release一次,不是销毁,只是release一次)
2. 使用ARC机制的话,就不允许使用autorelease,release,retain这些了
3. 返回对象本身(id类型)
4. 自动释放池也是对象(@autoreleasepool{}),释放池可以无限嵌套
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
p.age = 20;
}
当这个代码块执行完后,系统就会让释放池中的对象自动release一次
5. 可以把[[[Person alloc] init] autorelease]写成一个类方法,然后调用这个类方法类创建一个对象,而且这样也符合封装的原则,把alloc init autorelease封装到一个类方法中
也就是在.m文件中实现一个方法
+ (id)person
{
return [[[Person alloc] init] autorelease];
}
然后调用这个方法,可以快速创建一个已经autorelease过的对象,要注意的是最好在该类方法中用self来定义,这样可以让子类很好的继承父类的方法
Person *p = [Person person];
1.@class
使用场景
对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类
这种代码编译会报错。当使用@class在两个类相互声明,就不会出现编译报错
用法概括
使用 @class 类名; 就可以引用一个类,说明一下它是一个类
和#import的区别
#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了
在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类
2.循环retain
比如A对象retain了B对象,B对象retain了A对象
这样会导致A对象和B对象永远无法释放
解决方案
当两端互相引用时,应该一端用retain、一端用assign
内存管理--autorelease
1. 半自动释放(其实就是当大括号内的代码块运行完后,系统让释放池内的对象自动release一次,不是销毁,只是release一次)
2. 使用ARC机制的话,就不允许使用autorelease,release,retain这些了
3. 返回对象本身(id类型)
4. 自动释放池也是对象(@autoreleasepool{}),释放池可以无限嵌套
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
p.age = 20;
}
当这个代码块执行完后,系统就会让释放池中的对象自动release一次
5. 可以把[[[Person alloc] init] autorelease]写成一个类方法,然后调用这个类方法类创建一个对象,而且这样也符合封装的原则,把alloc init autorelease封装到一个类方法中
也就是在.m文件中实现一个方法
+ (id)person
{
return [[[Person alloc] init] autorelease];
}
然后调用这个方法,可以快速创建一个已经autorelease过的对象,要注意的是最好在该类方法中用self来定义,这样可以让子类很好的继承父类的方法
Person *p = [Person person];
0 0
- 黑马程序员复习-重点之内存管理
- 黑马程序员_OC学习之内存管理
- 黑马程序员_OC之内存管理
- 黑马程序员_OC学习之内存管理
- 黑马程序员-----OC学习之内存管理
- 黑马程序员--OC之内存管理
- 黑马程序员--OC之内存管理
- 黑马程序员——面试重点之内存泄露
- 黑马程序员学习笔记_OC之内存管理1
- 黑马程序员学习笔记_OC之内存管理 2
- 黑马程序员学习笔记_OC之内存管理3ARC
- 黑马程序员:OC学习日记之内存管理
- 黑马程序员_iOS开发之OC之内存管理
- 黑马程序员——OC学习之内存管理ARC
- 黑马程序员-----oc语言学习笔记之内存管理一
- 黑马程序员-----oc语言学习笔记之内存管理二
- 黑马程序员-----oc语言学习笔记之内存管理三
- 黑马程序员——OC笔记之内存管理
- mdev.c分析(一)
- 单例模式内容
- 单例模式的理解认识 练习笔记
- HDOJ 题目1217 Arbitrage(最短路径,Floyd)
- 希尔伯特(Hilbert)空间和巴拿赫(Banach)空间
- 黑马程序员复习-重点之内存管理
- Android framework回顾(3)binder利用及IBinder BpRefbase IInterface INTERFACE 之间关系
- 组最桩佐钻罪赘酌拙作卓捉追锥综锥桩钻
- 篆谆邹灼壮祖浊组桌总转专醉灼准坠撞罪
- JAVA学习第四十二课 — 泛型(二)—泛型接口&&通配符应用
- 谞奏字纂棕坠昨转着壮啄祝奏桌拽遵走座
- 机器学习推荐的论文和文章
- 滓做咨族仔棕罪兹座爪拙住卒宗赘兹柞诅
- 前路