自己生成对象并 自己持有:alloc、new、copy、mutableCopy
自己生成对象但 不持有(需要持有需 retain、或者 autorelease->订阅到自动释放池):[NSArray array]
释放非自己持有的对象会造成崩溃
内存管理的基础方法:alloc、release、retain、dealloc
头部内存管理计数与计数表管理计数的区别
- 头部内存管理
- 少量代码即可完成
- 能够统一管理引用计数的内存块与对象的内存块
- 计数表管理
- 对象用内存块无需考虑头部
- 引用计数表各记录内存块地址,可追溯到各对象的内存块
- 方便调试
autorelease
- 生成并持有NSAutoreleasePool对象
- 调用已分配对象的autorelease方法
- 释放autoreleasePool
aotorelease的作用,就是将已分配的对象添加到自动释放池,在自动释放池作用域结束的时候,给自动释放池内的所有对象调用release方法
ARC所有权修饰符 __unsafe_unretained
/*
__unsafe_unretained
是不安全的所有权修饰符
与weak相同的地方在于他们都不会持有对象
与weak不同的地方在于他不会自动将已释放的对象置为nil
*/
id __unsafe_unretained obj1 = nil;
{
id __strong obj2 = [NSObject new];
obj1 = obj2;
NSLog(@"作用域内 %@",obj1);
}
// 此处为访问野指针崩溃
NSLog(@"作用域外 %@",obj1);
所有权修饰符 __autorelesing

CoreFoundation框架与Foundation框架通过免费桥转换
CFTypeRef CFBridgingRetain(id X){
return (__bridge_retained CFTypeRef)X;
}
id CFBridgingRelease(CFTypeRef X){
return (__bridge_transfer id)X;
}
// CF桥接到F
CFMutableArrayRef cfArr = NULL;
{
NSMutableArray *ocArr = [[NSMutableArray alloc]init];
cfArr = CFBridgingRetain(ocArr);
CFShow(cfArr);
printf("retain count = %d\n",CFGetRetainCount(cfArr));
}
printf("out scope retain count = %d\n",CFGetRetainCount(cfArr));
CFRelease(cfArr);
// F桥接到CF
CFMutableArrayRef cfArr = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
printf("retain count = %d\n",CFGetRetainCount(cfArr));
id ocArr = CFBridgingRelease(cfArr);
printf("retain count = %d\n",CFGetRetainCount(cfArr));
属性

网友评论