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

内存管理原则(配对原则):
只要出现了 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] // 野指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值