1.
alloc
开辟内存空间
,
并且将对象的引用计数由
0
变为
1
retain 将对象的引用计数加 1
release 将对象的引用计数 ( 立即 )-1
2.在管理内存的时候,经常出现三个问题:
(1)内存泄露
现象:内存堆积,在运行中崩溃(占用内存较小时可能不会crash)
产生原因: 对一个对象进行 alloc,retain,copy 之后,没有对它进行相应的 release 或者 autorelease
解决方案: 对一个对象进行 alloc,retain,copy 之后,进行相应的 release 或者 autorelease(遵循谁污染,谁治理原则)
( 2 )野指针异常
现象 : 可能会崩溃 , 也可能不会崩溃 , 写到某一行代码时突然崩溃 .( 没有写任何和引用计数相关的代码 )
产生原因 : 该对象的空间已经被系统回收 , 不能再访问没有所有权对象 .
解决方案 : 空间被系统回收之后 , 禁止访问 .
(3)过度释放
现象 : 当写完和内存引用计数 -1 有关的操作后 , 程序立即 crash
原因 : 空间被系统回收之后 , 不能再做和引用计数 -1 有关的操作 , 否则会立即 crash
解决方案 : 删除多余释放的代码
3.autorelease:
会将声明为 autorelease 的对象放入离它最近的自动释放池中 , 当自动释放池销毁时 , 会向池中的每一个 对象发送一个 release 消息
4.内存管理原则:
如果你对一个对象进行 alloc,retain,copy 之后 , 你就拥有了该对象的所有权 , 你就必须对它进行 release 或者 autorelease
retain 将对象的引用计数加 1
release 将对象的引用计数 ( 立即 )-1
2.在管理内存的时候,经常出现三个问题:
(1)内存泄露
现象:内存堆积,在运行中崩溃(占用内存较小时可能不会crash)
产生原因: 对一个对象进行 alloc,retain,copy 之后,没有对它进行相应的 release 或者 autorelease
解决方案: 对一个对象进行 alloc,retain,copy 之后,进行相应的 release 或者 autorelease(遵循谁污染,谁治理原则)
( 2 )野指针异常
现象 : 可能会崩溃 , 也可能不会崩溃 , 写到某一行代码时突然崩溃 .( 没有写任何和引用计数相关的代码 )
产生原因 : 该对象的空间已经被系统回收 , 不能再访问没有所有权对象 .
解决方案 : 空间被系统回收之后 , 禁止访问 .
(3)过度释放
现象 : 当写完和内存引用计数 -1 有关的操作后 , 程序立即 crash
原因 : 空间被系统回收之后 , 不能再做和引用计数 -1 有关的操作 , 否则会立即 crash
解决方案 : 删除多余释放的代码
3.autorelease:
会将声明为 autorelease 的对象放入离它最近的自动释放池中 , 当自动释放池销毁时 , 会向池中的每一个 对象发送一个 release 消息
4.内存管理原则:
如果你对一个对象进行 alloc,retain,copy 之后 , 你就拥有了该对象的所有权 , 你就必须对它进行 release 或者 autorelease
5.谁污染,谁治理,不是自己alloc,retain,copy的对象不用管
例如:NSArray * arr = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", @"ccc", nil];
虽然在创建数组时调用了便利构造器,但是不用自己释放,因为系统类型的便利构造器已经自带了一个dealloc方法