大数据

OC内存管理

一.在定义类的属性的时候一般格式

@property(组1,组2,组3)NSString *title;

组1 :nonatomic VS atomic(默认)

nonatomic : 非原子性 ;atomic: 原子性 使用后者是在多线程的情况下, 多个线程同时使用对象的同一个属性时,确保多线程安全 一个线程使用时会枷锁 此时其他线程不能对该属性进行读写操作 直至该线程使用完毕,但会消耗内存。

组2:strong VS copy

strong 引用计数+1 节省内存空间 只在ARC环境下有
copy 产生一个副本,开拓另一个空间,会有两个地址,更加安全

组3: readonly VS readwrite(默认)

readonly 只读 只产生getter方法 不产生setter方法
readwrite 读写 getter setter方法都产生
OC 在 MRC环境下内存管理 平衡法则 增加了引用计数(alloc retain nsmuablecopy new copy等)就必须减去引用计数(relaease) 当引用计数为0时系统发送delloc消息自动释放

二. autorelease VS release

release对象引用计数立即-1
autorelease不减小对象引用计数 只是将对象放到自动释放引用池里 。当出了autoreleasepool作用域后 系统会给池子里的每个对发送一条release消息 , 当原引用计数为1时 -1 到0, 延迟释放 , 当引用计数为2 只减1 但无法释放 因为引用计数没归零 。
自动释放池可以不止一个,自动释放池里可以套一个自动释放池,加到栈顶的池子 栈先入后出

三.对象和对象指针

1.栈区 方法和函数运行的期间 局部变量 Dog *dog 对象指针
2.堆区 alloc出来的 由程序员管理 引用计数是针对这个区的 即针对对象的[[Dog alloc]init] 对象方法生产的对象
而 类方法产生的对象自动放在自动释放池了 不需要释放,否则多此一举 导致代码崩溃
3.全局区 全局变量 静态局部变量
4.只读区 不释放 不允许改

ps:
NSString 常量串没有引用计数 NSString *str = [[NSString alloc]initWithString :@“tom”];不会使引用计数+1 ,不产生新对象, 在文字常量区 不在堆区,不分配空间!!! /Format

改变工程的MRC 与ARC环境
创建工程后 build setting object-c a。。r。。。。c。。。

nil /NULL/ Nil 的区别
值都是0, 但 内置类型的指针置空值用NULL , 对象指针置空值用nil, 类对象指针 Nil

 int *p = NULL;  
NSObject *obj = nil;     
Class base = Nil;

值得一提的是 ARC环境与MRC环境是可以混编的 。