所有内容引用自
《Objective-C 高级编程 iOS与OS X多线程和内存管理》
,加入了自己的部分理解。
本节小结,点小1
跳到底部[1]
- 不能使用
retain/release/retainCount/autorelease
- 不能使用
NSAllocateObject/NSDeallocateObject
- 须遵守内存管理的方法命令规则
- 不要显示调用
dealloc
- 使用
@autoreleasepool
块替代NSAutoreleasePool
- 不能使用区域(
NSZone
) - 对象型变量不能作为
C
语言结构体(struct/union
)的成员 - 显示转换
id
和void *
部分解释
对象型变量不能作为C
语言结构体(struct/union
)的成员
例如这样就是不允许的
struct Data{
NSArray *array;
};
原因: C
语言没有方法管理结构体成员的生存周期。
ARC
环境中编译器管理内存,必须知道对象的生命周期。但C
结构体不在管理范围内,所以不能直接使用。
可加上__unsafe_unretained
修饰,让变量不属于编译器管理的对象。需要自己管理,注意内存泄露。
显示转换id和void*
如果转换?(为啥要转换?还不知道)
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (__bridge id)p;
注:
__bridge void *
这种转换跟__unsafe_unretained
一样不安全,容易产生悬垂指针导致crash
__bridge_retained
相当于 retain
__bridge_transfer
相当于 release
为啥要转换? 因为Objective-C
和Core Foundation
对象之间相互变换就需要用到。
Objective-C
对象和Core Foundation
对象没有区别,ARC
无效时,可以用简单的C
语言的转换也能实现互换。
因为转换不需要额外的CPU
资源,所以也叫免费桥
(Toll-Free Bridge
)
属性
属性声明的属性与所有权修饰符的对应关系
属性声明的属性 | 所有权修饰符 |
---|---|
assign |
__unsafe_unretained 修饰符 |
copy |
__strong 修饰符(赋值的是被复制的对象) |
retain |
__strong 修饰符 |
strong |
__strong 修饰符 |
unsafe_unretained |
unsafe_unretained 修饰符 |
weak |
__weak 修饰符 |
小结
主要有一个规则、一个属性对应关系
-
😊假装是锚点的脚注 ↩
网友评论