@lass关键字 ARC机制

OC加强day02

@class关键字
- 两个类A和B, 如果互相#import对方头文件,会造成死循环
- 解决方式
- 在其中的一方,不要用#import

#import "B.h"
@interface A : NSObject

@end


//#import "A.h"

@class A;//告诉编译器 有名字叫做A这么一个类
@interface B : NSObject


@end

#import "A.h"
@implementation B
{

}
  • #import和@class的区别
    • 归属的类型不同
      • #import是预处理指令在编译之前就进行内容转换
      • @class 类名 这是一句OC代码
    • 作用不同
      • #import拷贝 包含在头文件的内容
      • @class 类名 仅仅是告诉编译器这是一个类、

循环retain
- 什么是循环retain
- A类中有一个属性是B类的对象
- B类中有一个属性是A累的对象
- 这时候如果A类中 B类的对象用retain参数
- B类中的A类对象也用retain参数
- 那么就会造成循环retain, 导致内存泄漏
- 解决方法:
- 一段用retain 一段用assign
- **注意: 用assign的那一端 在dealloc中 不需要调用release

自动释放是
- 自动释放池是什么?
用来存放对象的一个池子
存储在自动释放池中的对象,当自动释放出销毁的时候,会向存储池子中的”所有对象”发送一条release消息

  • 如果把一个对象放入自动释放池中?
    只要在自动释放池的范围内 调用对象的autorelease方法,就可以把对象放入池子中了

  • 自动释放池的好处
    唯一好处:可以省略创建对象以后要匹配的那个release代码
    自动释放池的七大注意

  • 只有在自动释放池中 调用了 autorelease方法 才,才是将这个对象存储在了自动释放池中
  • 对象的创建可以在在自动释放池的外面 然后再自动释放池中调用方法,
  • 自动释放池结束的时候 仅仅是为在池子中的对象发送了一条release消息
  • 如果自动释放池中调用了同一个对象多次那么就会在结束的时候多次返回release消息 会出现将是对象错误
  • 如果在释放池中调用了release方法 那么在池子结束后还会调用一次 会出现野指针
  • 将对象存储到自动释放池中 并不会是对象的引用计数器+1
  • 自动释放池也可以嵌套 只有在当前自动释放池结束的时候就会向对象发送release消息

自动释放池的规范
- 如果使用类方法创建一个对象, 要求必须在这个对象在方法中已经被 autorelease过了

ARC机制
- 什么是ARC
- 自动引用计数器
- 编译器会在适当的情况下自动释放对象
- ARC下对象是怎么回收的?
- 本质上:不管在MRC还是ARC 对象的引用计数器的值为0的时候回收
- 表象上
- 一个对象如果没有任何强指针指向的时候他就会被立即回收
- 强指针和弱指针
- 强指针: 用__strong修饰的指针(默认)
- 弱指针: 用__weak就是的指针
- 作用: 用来判断对象是否可以被系统回收

@property参数 strong 和weak
- @property参数strong与weak
- 作用:@property 自动生成的私有属性 到底是强指针 还是 弱指针

  • “@property (strong/weak) NSString * name;

  • strong:生成的私有属性是强指针

  • weak:生成的私有属性是弱指针

  • 在ARC机制下 setter方法的实现 就是直接赋值 不需要做任何事情

  • 在ARC下 不能用retain,因为retain是指生成的setter方法的实现 中 是标准的内存管理代码

  • 一般来说在MRC下用retain参数 —> ARC下就用strong

  • 一般来说在MRC下用assign参数—>ARC下就用assign

ARC机制先得循环引用
- 什么是循环引用
- 当对象A中有对象B作为属性
- 而且 对象B中有对象A作为属性
- 如果这两个属性 都是用__strong修饰那么就会形成循环引用
- 就会导致两个对象都不能回收

2.例题:

    人类Person:
    {
        电脑属性;
    }

    电脑类Computer:
    {
        人属性(拥有者);
    }

@property 参数总结
- 1.
- atomic <—-> nonatomic
- 这两个参数,无论在MRC还是ARC都可以使用
- 2.
- retain: 只能使用在MRC模式下,在MRC模式先 当属性的类型是OC对象的时候,绝大多数场景下使用
- assign 可以使用在ARC和MRC模式下。
- 在ARC下 : 当属性的类型是非OC对象的时候 一律使用assign
- 在MRC模式下: 当属性循环引用的时候 1边使用assign一遍使用retain
- 3.
- strong:只能使用在ARC模式下,当属性的类型是OC对象的时候 绝大多数场景使用strong
- weak: 只能使用在ARC模式下,当出现循环引用的时候,一遍使用strong一遍使用weak
- 4.
- getter setter 修改方法名字
- 5.
- readonly
- readwrite
- 无论MRC ARC都可以使用

MRC终极写法

 @property(nonatomic,assign(非OC对象)/retain(OC对象))类型 属性名称
 大部分情况只要有OC对象就用 retain
 当出现循环retain时候
 一段就用retain  一段用  assign

ARC终极写法

 @property(nonatomic,assign(非OC对象)/weak/strong)类型 属性名
 大部分情况只要OC对象就使用strong
 当出现循环引用的时候 一段 weak 一段strong
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值