4 3.OC9-内存管理1-retain和release

4 3.OC9-内存管理1-retainrelease

 

内存管理

范围:

任何继承了NSObject的对象,对基本数据类型无效。

 

原理:

1)、每个对象内部保存了一个与之相关联的整数,称为引用计数器

2)、当使用allocnew或者copy创建一个对象时,对象的引用计数器设置为1

3)、给对象发送一条retain消息,可以使引用计数器值+1

4)、给对象发送一条release消息,可以使引用计数器值-1

5)、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。

6)、可以给对象发送retainCount消息获得当前的引用计数器值。

 

 

内存管理原则

1)、谁创建,谁释放(“谁污染,谁治理”)。如果你通过allocnew或(mutablecopy来创建一个对象,那么你必须调用release autorelease。换句话说,不是你创建的,就不用你去释放。

2)、一般来说,除了allocnewcopy之外的方法创建的对象都被声明了autorelease

3)、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release

 

例一:

main.m

 //

//  main.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Student.h"

 

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        Student *stu = [[Student alloc] init]; //1

        

        [stu release]; //0

        

        //[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存

    }

    return 0;

}

 

Student.h

 //

//  Student.h

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

@propertyint age;

 

@end

 

Student.m

 //

//  Student.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import "Student.h"

 

@implementation Student

@synthesize age = _age; //xcode5.0环境下是可以省略的

 

- (void) dealloc{

    NSLog(@"%@被销毁了", self);

    

    [superdealloc]; //一定要调用superdealloc方法,而且最好要放在最后面调用

    

}

@end

 

  运行结果

2013-12-09 11:32:58.451 内存管理retianrelease[466:403] <Student: 0x1001144d0>被销毁了

 

 

----------------

例二:

main.m

 //

//  main.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Student.h"

 

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        Student *stu = [[Student alloc] init]; //1

        

        //z代表无符号

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu retain]; //2

        

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu release]; //1

        

        NSLog(@"count:%zi", [stu retainCount]);

        

        [stu release]; //0

        

        //[stu release]; //会发生野指针错误,也就是说访问了不属于你的内存

    }

    return 0;

}

 

Student.h

 //

//  Student.h

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

@propertyint age;

 

@end

 

Student.m

 //

//  Student.m

//  内存管理retianrelease

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import "Student.h"

 

@implementation Student

@synthesize age = _age; //xcode5.0环境下是可以省略的

 

- (void) dealloc{

    NSLog(@"%@被销毁了", self);

    

    [superdealloc]; //一定要调用superdealloc方法,而且最好要放在最后面调用

    

}

@end

 

 运行结果

2013-12-09 10:59:09.977 内存管理retianrelease[447:403] count:1

2013-12-09 10:59:09.987 内存管理retianrelease[447:403] count:2

2013-12-09 10:59:10.002 内存管理retianrelease[447:403] count:1

2013-12-09 10:59:10.012 内存管理retianrelease[447:403] <Student: 0x1001144d0>被销毁了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值