iPhone 内存管理
http://www.cnblogs.com/wwwkhd/archive/2011/01/12/1933788.html iPhone 内存管理(转)
http://blog.csdn.net/ilysony/article/details/6332483 异步加载的网络图片的控件
http://hi.baidu.com/yangcong121/home
http://dev.10086.cn/cmdn/wiki/index.php?doc-view-3333.html iPhone开发过程的困惑
http://keywind.me/?p=169 iPhone内存管理详细解说(一)
创建一个命令行项目:
String对象不管内存,测试代码:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *obj=[[NSString alloc ]init];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
NSString *obj2=obj;
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
[obj release];
NSLog(@"%i,%@,%@",3,*obj,obj);
[pool drain];
return 0;
}
1,NSCFString,-1
2,NSCFString,-1
3,NSCFString,
数组的释放
单个数组的释放.
http://www.cocoachina.com/bbs/read.php?tid-11705.html
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *obj = [NSMutableArray arrayWithArray:
[[NSArray alloc] initWithObjects:
@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"k",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",nil]];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
[pool drain];
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
return 0;
}
1,NSCFArray,1
2,NSCFArray,-1
使用1次retain:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *obj = [NSMutableArray arrayWithArray:
[[NSArray alloc] initWithObjects:
@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"k",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",nil]];
[obj retain];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
[pool drain];
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
return 0;
}
1,NSCFArray,2
2,NSCFArray,1
使用2次:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *obj = [NSMutableArray arrayWithArray:
[[NSArray alloc] initWithObjects:
@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"k",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",nil]];
[obj retain];
[obj retain];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
[pool drain];
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
return 0;
}
1,NSCFArray,2
2,NSCFArray,1
retain了2次,必须release2次,才能释放干净:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *obj = [NSMutableArray arrayWithArray:
[[NSArray alloc] initWithObjects:
@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"k",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",nil]];
[obj retain];
[obj retain];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
[pool drain];
[obj release];
[obj release];
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
return 0;
}
1,NSCFArray,3
2,NSCFArray,-1
将数组直接给另一数组:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *obj = [NSMutableArray arrayWithArray:
[[NSArray alloc] initWithObjects:
@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"k",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",nil]];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
NSMutableArray *obj2=obj;
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
NSLog(@"%i,%@,%i",2,*obj2,obj2.retainCount);
[pool drain];
NSLog(@"%i,%@,%i",3,*obj,obj.retainCount);
return 0;
}
1,NSCFArray,1
2,NSCFArray,1
2,NSCFArray,1
3,NSCFArray,-1
下面将报错
NSArray *obj=[[NSArray alloc]init];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
NSArray *obj2=obj;
NSArray *obj3=obj2;
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
NSLog(@"%i,%@,%i",2,*obj2,obj2.retainCount);
[obj3 release];
[obj2 release];
[obj release];
NSLog(@"%i,%@,%@",3,*obj,obj);
1,__NSArray0,2
2,__NSArray0,2
2,__NSArray0,2
hello(2557) malloc: *** error for object 0x10010caf0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
正确的是:
NSArray *obj=[[NSArray alloc]init];
NSLog(@"%i,%@,%i",1,*obj,obj.retainCount);
NSArray *obj2=obj;
NSArray *obj3=obj2;
NSLog(@"%i,%@,%i",2,*obj,obj.retainCount);
NSLog(@"%i,%@,%i",2,*obj2,obj2.retainCount);
[obj release];
NSLog(@"%i,%@,%@",3,*obj,obj);
在这种情况下,释放obj,obj2,obj3,只要写一句就可以.