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

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

2014-03-19 22:21 543 查看
1.属性声明与所有权修饰符的对应关系

属性声明: 所有权修饰符

assign :__unsafe_unretained

copy :__strong

retain :__strong

strong :__strong

unsafe_unretained :__unsafe_unretained

weak :__weak

2. 除__unsafe_unretained 修饰符外,__strong/__weak/__autoreleasing修饰符保证其指定的变量初始化为nil;

3.

array = (id __strong *)malloc(sizeof(id) * entries);
for (NSUIntegre i = 0; i < entries; i++)
	array[i] = nil;


以上这种赋值是非常危险的,因为由malloc函数分配的内存区域没有被初始化为0,因此nil会被赋值给附有__strong修饰符的并被赋值了随机地址的变量中,从而释放一个不存在的对象。在分配内存的时候推荐使用calloc。用malloc函数分配后可用memset函数将内存填充为0;

4. 简单的用free函数废弃了数组用内存块的情况下,数组各元素所赋值的对象不能再次释放,从而引起内存泄漏。

因为在静态数组中,编译器能够根据变量的作用域自动插入释放复制对象的代码,而在动态数组中,编译器不能确定数组的生存周期,所以无从处理。

for (NSUIntegre i = 0; i < entries; i++)
	array[i] = nil;
free(array);


5. ARC由一下工具来实现:

clang(LLVM编译器)3.0以上

objc4 Objective-C 运行时库493.9以上

6. __weak 修饰符的变量所引用的对象被废弃,则将nil赋值给该变量这一功能即被实现。

由此可知,如果大量使用附有__weak 修饰符的变量,则会消耗相应的cpu资源。

7.__weak 修饰符变量所引用的对象被注册到autoreleasepool 中。

{
	id __weak o = obj;
	NSLog(@"1 %@", o);
	NSLog(@"2 %@", o);
	NSLog(@"3 %@", o);
	NSLog(@"4 %@", o);
	NSLog(@"5 %@", o);
}
//  变量o 所赋值的对象也就注册到autoreleasepool中5次。

{
	id __weak o = obj;
	id tmp = 0;
	NSLog(@"1 %@", o); 
	NSLog(@"2 %@", o);
	NSLog(@"3 %@", o);
	NSLog(@"4 %@", o); 
	NSLog(@"5 %@", o);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: