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