您的位置:首页 > 移动开发 > Objective-C

[Object C]_[初级]_[Object C之内存管理]

2015-12-31 20:17 651 查看
在项目中,经常会程序崩溃,内存增大等问题,影响程序的性能,出现这个问题的原因就是内存泄露,创建的对象没有释放,或者是对象被多次释放。所以内存管理对于整个项目来说是非常重要的。

内存管理常用的几个方法

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;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object c 内存管理