黑马程序员复习-重点之内存管理

来源:互联网 发布:淘宝店如何更改类目 编辑:程序博客网 时间: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

   比如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
原创粉丝点击