【Objective-C高级编程】iOS与OS X多线程和内存管理
2014-03-19 19:04
519 查看
1. __weak修饰符的优点,除了解决循环引用的问题,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效并且处于nil被赋值的状态(空弱引用)。
如:
2. 尽管ARC式的内存管理时编译器的工作,但附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。
3. __weak 修饰符只能用于ios5以上以及OS X Lion 以上版本的应用程序。
4.将生成的对象直接赋给__weak 或者__unsafe_unretained 的变量会产生警告 [-Warc-unsage-ratained-assign];
需将强引用的对象赋值给__weak 或者__unsafe_unretained 的变量。
5. 在ARC下,使用@autoreleasepool块来替代“NSAutoreleasePool类对象生成、持有及废弃”这一范围。
6. obj为强引用,自己持有对象。该对象由编译器判断其方法后,自动注册到autoreleasepool,因为变量obj超出了作用域,强引用失效,所以自动释放了自己持有的对象。
同时随着@autoreleasepool块的结束,注册到autoreleasepool中的所有对象被自动释放。因为对象的所有者不存在,所以废弃对象。
7. 为了防止_weak 变量在访问引用对象的过程中,该对象有可能被废弃,故而把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool块结束之前都能确保该对象存在。
8. id *obj 的全式是 id _autoreleasing *obj;
同样的是: NSObject **obj 为 NSObject *__autoreleasing * obj;
9.
10. 显示指定__autoreleasing 修饰符时,必须注意对象变量要为自动变量(包括局部变量、函数以及方法参数)。
11. 打印autoreleasepool 的调试信息
12. ARC规则
①不能使用 retain、release、reatainCount/autorelease
②不能使用 NSAllocateObject/NSDeallocateObject;
③需遵守内存管理的方法命名规则
(alloc/new/copy/mutableCopy)
④不要现实调用dealloc
⑤使用@autoreleasepool块代替NSAutoreleasePool
⑥不能使用区域(NSZone)
⑦对象型变量作为C语言结构体(struct/union)的成员
因为ARC把内存管理的工作分配给编译器,所以编译器必须能够知道并管理对象的生存周期。
C语言的自动变量(局部变量)可使用该变量的作用域管理对象。
但对于C语言的结构体成员来说,这在标准上是不可实现的。
但可以强制转换为 void *,或者附加 __unsafe_unretained 修饰符。
(附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。)
⑧显示转换(id) 和(void*)
非ARC下两者可以转换,在ARC下两者的转换需借助 __bridge
13. GNUstep 跟 cocoa 框架可以替换。
如:
id __wark obj1 = nil; { id _strong obj0 = [[NSObject alloc] init]; obj1 = obj0; NSLog(@"A: %@", obj1); } NSLog(@"B: %@", obj1); A:<NSObject: 0x111111> B:(null)
2. 尽管ARC式的内存管理时编译器的工作,但附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。
3. __weak 修饰符只能用于ios5以上以及OS X Lion 以上版本的应用程序。
4.将生成的对象直接赋给__weak 或者__unsafe_unretained 的变量会产生警告 [-Warc-unsage-ratained-assign];
需将强引用的对象赋值给__weak 或者__unsafe_unretained 的变量。
5. 在ARC下,使用@autoreleasepool块来替代“NSAutoreleasePool类对象生成、持有及废弃”这一范围。
@autoreleasepool { id _autoreleaseing obj = [[NSObject alloc] init]; }
6. obj为强引用,自己持有对象。该对象由编译器判断其方法后,自动注册到autoreleasepool,因为变量obj超出了作用域,强引用失效,所以自动释放了自己持有的对象。
同时随着@autoreleasepool块的结束,注册到autoreleasepool中的所有对象被自动释放。因为对象的所有者不存在,所以废弃对象。
@autoreleasepool { id _strong obj = [NSMutableArray array]; }
7. 为了防止_weak 变量在访问引用对象的过程中,该对象有可能被废弃,故而把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool块结束之前都能确保该对象存在。
8. id *obj 的全式是 id _autoreleasing *obj;
同样的是: NSObject **obj 为 NSObject *__autoreleasing * obj;
- (BOOL)performOperationWithError:(NSError **)error; - (BOOL)preformOperationWithError:(NSError * __autoreleasing *)error;
9.
- (BOOL)preformOperationWithError:(NSError * __autoreleasing *)error; { //error *error = [[NSError alloc] initWithDomain:MyAppDomain code:errorCode userInfo:nil]; return NO; }
NSError *error = nil; BOOL result = [obj performOperationWithError:&error];
NSError __strong *error = nil; NSError __autoreleasing *tmp = error; BOOL result = [obj performOperationWithError:&tmp]; error = tmp;
10. 显示指定__autoreleasing 修饰符时,必须注意对象变量要为自动变量(包括局部变量、函数以及方法参数)。
11. 打印autoreleasepool 的调试信息
// 函数声明 extern void _objc_autoreleasePoolPrint(); // 开始调试 _objc_autoreleasePoolPrint();
12. ARC规则
①不能使用 retain、release、reatainCount/autorelease
②不能使用 NSAllocateObject/NSDeallocateObject;
③需遵守内存管理的方法命名规则
(alloc/new/copy/mutableCopy)
④不要现实调用dealloc
⑤使用@autoreleasepool块代替NSAutoreleasePool
⑥不能使用区域(NSZone)
⑦对象型变量作为C语言结构体(struct/union)的成员
因为ARC把内存管理的工作分配给编译器,所以编译器必须能够知道并管理对象的生存周期。
C语言的自动变量(局部变量)可使用该变量的作用域管理对象。
但对于C语言的结构体成员来说,这在标准上是不可实现的。
但可以强制转换为 void *,或者附加 __unsafe_unretained 修饰符。
(附有 __unsafe_unretained 修饰符的变量不属于编译器的内存管理对象。)
struct Data{ NSMutableArray __unsafe_unretained *array; };
⑧显示转换(id) 和(void*)
非ARC下两者可以转换,在ARC下两者的转换需借助 __bridge
id obj = [[NSObject alloc] init]; void *p = (__bridge void *)obj; id o = (_bridge id)p;扩展:__btidge_retained __bridge_transfer
13. GNUstep 跟 cocoa 框架可以替换。
相关文章推荐
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记一
- 《Objective-C高级编程:iOS与OS X多线程和内存管理》读后感
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记一
- 内存管理原理----《Objective-C高级编程:iOS与OS X多线程和内存管理》读书笔记
- 读书笔记:Objective-C高级编程 iOS与OS X多线程和内存管理 ——(持续)
- Objective-C高级编程 iOS与OS X多线程和内存管理 读书笔记(一)
- 读《Objective-C高级编程iOS与OS X多线程和内存管理》
- Objective-C 高级编程:iOS与OS X多线程和内存管理
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记三
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(四) Block的实现
- Objective-C 高级编程:iOS与OS X多线程和内存管理
- 《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记三
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(五) Blocks 截获自动变量值
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(六) __block 说明符
- 《Objective-C高级编程:iOS与OS X多线程和内存管理》读书笔记
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(七) __block 从栈上复制到堆
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(八) __block 从栈上复制到堆 截获对象 数组
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(九) Block 循环引用