您的位置:首页 > 移动开发 > IOS开发

《ios—单个对象的内存管理》

2015-12-19 16:26 375 查看
内存管理原则(配对原则):

只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease。

保证代码中allo和release成对出现是保证内存管理的关键。

僵尸对象:被系统回收的对象我们称之为僵尸对象。

手动内存管理研究问题方法:

1、

野指针操作:指针对象被释放了之后(retainCount=0之后系统自动释放),再使用这个对象指针会造成的崩溃效果。

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;
- (void)run;
@end

#import "Person.h"

@implementation Person

- (void)dealloc
{
[super dealloc];

NSLog(@"Person 被销毁了");
}

- (NSString *)description
{
return [NSString stringWithFormat:@"age = %d",_age];
}
- (void)run
{
NSLog(@"人跑起来了");
}
@end


Person * p = [[Person alloc] init];  // retainCount = 1
p.age = 20;
NSLog(@"%@",p);
[p release];   // retainCount = 0 p将被系统自动释放
NSLog[@"%@",p]  // 野指针


解决野指针的方法:如果确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil,之后无论访问什么方法和属性都不会造成野指针,因为调用nil的任何属性和方法都是没效果的。

Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
[p release];
//如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
p = nil;

p.age = 30;//[nil setAge:30];
[p run]; //[nil run];


2、
**内存泄漏**:指的就是,不再被使用的对象,一直在内存中没有被销毁.会造成程序内存在运行过程中内存占用很大,就会造成内存警告,最后系统自动闪退。


//内存泄漏第一种情况
//1
Person * p = [[Person alloc] init];
p.age = 20;
NSLog(@"%@",p);
//2
[p retain];
//3
[p retain];
//2
[p release];
//内存泄漏第一种情况
Person * p = [[Person alloc] init];
p.age = 20;
[p run];
p = nil;
[p release];//[nil release];

Person * p = [[Person alloc] init];
p.age = 20;
Person * p1 = p;  // 两个指针指向同一个对象的内存空间
[p1 release];  // 内存被释放 不能在调用
[p.age = 10]; // 野指针
[p1.age = 10] // 野指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: