iPhone 内存管理

 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,只要写一句就可以.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值