[Object C]_[初级]_[Object C之内存管理]
2015-12-31 20:17
651 查看
在项目中,经常会程序崩溃,内存增大等问题,影响程序的性能,出现这个问题的原因就是内存泄露,创建的对象没有释放,或者是对象被多次释放。所以内存管理对于整个项目来说是非常重要的。
内存管理常用的几个方法
autorelease:把对象放到最近的内存池里,程序结束自动释放内存
release:引用计数减1,释放内存
retain:引用计数加1,对象拷贝了一份
retainCount:记录对象被引用的次数
dealloc:引用计数为0,自动调用该方法,把创建的对象进行销毁。
例子:
MyClass.h
MyClass.m
main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool =[NSAutoreleasePool new];
NSMutableArray* array =[[NSMutableArray alloc] init];
for (int i =0; i<6; i++)
{
MyClass *ii =[[MyClass alloc] init];
[ii setName:[NSString stringWithFormat:@"name%d",i+1]];
[array addObject:ii];//ii被复制了一份,引用计数加1
//[ii release]; //引用计数减1
//输出是1,如果把[ii release]取消注释,输出是2.
NSLog(@"addobject ii:%ld",[ii retainCount]);
}
//[array retain];
//如果把[array retain];取消注释,输出是2.
NSLog(@"array:%ld",[array retainCount]);
[array release];//引用计数减1
//retain
MyClass *object =[MyClass new];
[object setName:@"object"];
//如果[object release]; temp指向的是一个无效的指针,运行报错
//如果对[object retain],把object拷贝了一份,引用计数加1.
MyClass *temp =[object retain];//赋值不拷贝一份,运行到[temp release]会报错
NSLog(@"name:%@",temp.name);
[object release];
[temp release];
//autorelease 把对象放到最近的内存池中,等方法调用完之后,自动释放内存
MyClass* autoObject =[[MyClass new]autorelease];
[autoObject setName:@"autoObject"];
//没有必要手动release对象,释放内存。
//[autoObject release];
[pool drain];
return 0;
}
运行结果:
内存管理常用的几个方法
autorelease:把对象放到最近的内存池里,程序结束自动释放内存
release:引用计数减1,释放内存
retain:引用计数加1,对象拷贝了一份
retainCount:记录对象被引用的次数
dealloc:引用计数为0,自动调用该方法,把创建的对象进行销毁。
例子:
MyClass.h
#import <Foundation/Foundation.h> @interface MyClass : NSObject { NSString* name; } @property (readwrite,copy) NSString* name; @end
MyClass.m
import "MyClass.h" @implementation MyClass @synthesize name; -(id) init { self =[super init]; if(self) { NSLog(@"构造iCount:%ld",self.retainCount); } return self; } //引用计数为0时,调用该方法 -(void) dealloc { NSLog(@"析构iCount:%ld",self.retainCount); [super dealloc]; } @end
main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool =[NSAutoreleasePool new];
NSMutableArray* array =[[NSMutableArray alloc] init];
for (int i =0; i<6; i++)
{
MyClass *ii =[[MyClass alloc] init];
[ii setName:[NSString stringWithFormat:@"name%d",i+1]];
[array addObject:ii];//ii被复制了一份,引用计数加1
//[ii release]; //引用计数减1
//输出是1,如果把[ii release]取消注释,输出是2.
NSLog(@"addobject ii:%ld",[ii retainCount]);
}
//[array retain];
//如果把[array retain];取消注释,输出是2.
NSLog(@"array:%ld",[array retainCount]);
[array release];//引用计数减1
//retain
MyClass *object =[MyClass new];
[object setName:@"object"];
//如果[object release]; temp指向的是一个无效的指针,运行报错
//如果对[object retain],把object拷贝了一份,引用计数加1.
MyClass *temp =[object retain];//赋值不拷贝一份,运行到[temp release]会报错
NSLog(@"name:%@",temp.name);
[object release];
[temp release];
//autorelease 把对象放到最近的内存池中,等方法调用完之后,自动释放内存
MyClass* autoObject =[[MyClass new]autorelease];
[autoObject setName:@"autoObject"];
//没有必要手动release对象,释放内存。
//[autoObject release];
[pool drain];
return 0;
}
运行结果:
相关文章推荐
- Lua的内存管理浅析
- 跟我学习JScript的Bug与内存管理
- 跟我学习javascript的垃圾回收机制与内存管理
- 深入探讨PHP中的内存管理问题
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- javascript内存管理详细解析
- JavaScript内存管理介绍
- Cocos2d-x的内存管理总结
- 模拟实现C语言中的内存管理
- javascript错误的认识不用关心内存管理
- IOS中内存管理那些事
- Python深入学习之内存管理
- 简单说说STL的内存管理
- InnoDB存储引擎的内存管理机制
- jemalloc优化MySQL、Nginx内存管理
- 【转】JVM内存管理:深入垃圾收集器与内存分配策略
- JavaScript内存管理介绍
- C/C++内存管理详解
- Oracle 自动管理 ASMM