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

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);
}





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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。