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;
4. 简单的用free函数废弃了数组用内存块的情况下,数组各元素所赋值的对象不能再次释放,从而引起内存泄漏。
因为在静态数组中,编译器能够根据变量的作用域自动插入释放复制对象的代码,而在动态数组中,编译器不能确定数组的生存周期,所以无从处理。
for (NSUIntegre i = 0; i < entries; i++) array[i] = nil; free(array);
{ 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多线程和内存管理(二),布布扣,bubuko.com
【Objective-C高级编程】iOS与OS X多线程和内存管理(二)
原文:http://blog.csdn.net/mad2man/article/details/21552655