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

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

如:

id __wark obj1 = nil;
{
	id _strong obj0 = [[NSObject alloc] init];
	obj1 = obj0;
	NSLog(@"A: %@", obj1);
}
NSLog(@"B: %@", obj1);

A:
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 框架可以替换。






你可能感兴趣的:(读书笔记)