您的位置:首页 > 移动开发 > Objective-C

【Objective-C高级编程】iOS与OS X多线程和内存管理

2014-03-19 19:04 519 查看
1. __weak修饰符的优点,除了解决循环引用的问题,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效并且处于nil被赋值的状态(空弱引用)。

如:

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 框架可以替换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐