IOS基础之 (十一) 内存管理 ARC

一 内存管理

1. set 方法内存管理的相关参数

  retain: release旧值,retain新值(值适用于OC对象)

  assign:直接赋值(set方法默认,适用于非OC对象类型,即基本数据类型,也包括枚举和结构体)

  copy : release 旧值, copy 新值(NSString)

2. 是否生成set方法

  readWrite: 读写(同时声明和实现 setter, getter,默认) 

  readonly:只读(只会生声明和实现getter方法)

3.多线程管理

  nonatomic:性能高

  atomic:性能低(默认使用这个)

4. setter和getter方法的名称

  setter:给set方法改个名字,一定要有冒号( : )

  getter: 给get 方法改个名字(BOOL类型用的较多)。

@property [getter=isRich] BOOL rich;

二 模型类

模型就是用来装数据,就是一个存放数据的类,就叫做模型类。

发微博的人: 名字,微博账号,密码,头像,性别, 生日

发的微博: 写微博的人,微博内容, 标题,微博图,转发微博,被评论, 被转发

三 循环引用

循环引用:你引用我,我引用你

1. @class的作用:仅仅告诉编译器有这么一个类,并不知道里面有什么。

    @class person 告诉编译器有person这个类,

2.开发中引用一个类的规范。

  在.h文件中用@class声明。

  在.m文件中用#import来包含类中所有的东西。

3.为什么要用@class?

  @class和性能有关,可以循环引用,还可以提高编译效率。

  @import作用是拷贝。

 4.两端循环应用的解决方案

  一端用assign ,另一端用 retain。

四 autorelease基本使用法

1.首先把一个对象发到池子中。

2.当自动释放池被销毁时,会对里面的对象做一次release操作

3.返回对象本身。

4.调用完autorelease后,对象的计数器是不变,不会对它减一。

5.如果调用了两次 autorelease后,会报错,野指针错误。

autorelease的好处

   不用再去关心对象的释放时间

   不在关心什么时候去调用release.

autorelease使用注意:

   占用内存较小的对象不在随便的使用 autorelease.

错误写法:

    如果调用了两次autorelease,会报错,野指针。

@autoreleasepool{
   //这样写是错误的,在面试中常见
   Person *p = [[[[Person alloc]init]autorelease]autorelease];
}

内存管理总结:

1. 计数器的操作

   retain   +1

   release  -1

   retianCount 获得计数器

2. set方法的内存管理

- (void)setCar: (Car *) _car{
    if( _car != car){
         [_car release];
       _car = [car retain];
    }

}

   dealloc 方法的实现

- (void)dealloc(){
   [_car release];   
   [super dealloc];
}

 3 @property参数

  OC对象类型

 非OC对象类型

ARC : ARC是编译器特性。当编译器发现 retian 或者 alloc,自动帮我们插入代码(release)

ARC的判断准则:只要没有强指针指向对象,对象就会被释放。

强指针:默认情况下都是强指针。__strong 是双下划线。

__strong Person *p2 = [[Person alloc]init];

 弱指针:__weak 

__weak Person *p = [[Person alloc]init];
NSLog(@"%@" , p); //错误的写法

 两端循环引用的时候:

ARC:

   一端用strong,另一端用weak。

非ARC:

    一端用retain,另一端用assign。

  

 参考资料:

http://www.cnblogs.com/silence-wzx/p/5140978.html

http://www.cnblogs.com/wxios/articles/4175468.html

http://www.cnblogs.com/chars/p/5232109.html

  

原文地址:https://www.cnblogs.com/wangshuo1/p/ios-11.html