码迷,mamicode.com
首页 > 其他好文 > 详细

【OC. 内存管理】retain和release

时间:2014-08-14 16:29:58      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   数据   ar   div   

内存管理

任何继承了NSObject的对象,都需要进行垃圾回收,对基本数据类型无效(int float double 指针等)           

原理

每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1

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

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

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

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

 

附上下列代码:【在版本上面本机xcode不支持retain 和release】

Student.h
#import <Foundation/Foundation.h>

@interface Student : NSObject
@property int age;

@end
Student.m
#import "Student.h"

@implementation Student

@synthesize age=_age;

-(void)dealloc{
    NSLog(@"%@被销毁了",self);//表示self被销毁了。这里是访问自己的内存地址的内容
    
    
    //super 最好放在后面,自己的一些实现,放在前面
    [super dealloc];  //一定要调用回super的dealloc方法
}


@end
main.m
#import <Foundation/Foundation.h>
#import "Student.h"

void test()
{
    
    // insert code here...
    NSLog(@"Hello, World!");
    Student *stu=[[Student alloc] init];//这alloc后计数器为1
    
    NSLog(@"count %zi",[stu retainCount]);//查看计数器的数字条数。
    [stu retain];//这里计数器会+1;现在变为2
    
    NSLog(@"count %zi",[stu retainCount]);//查看计数器的数字条数。
    [stu release];
    NSLog(@"count %zi",[stu retainCount]);//查看计数器的数字条数。
    
  [stu release];
    //!!!!!!这里不能实用NSLog(@"count %zi",[stu retainCount]);//查看计数器的数字条数。因为retain变为0,不存在。
    //不能多次release 也就是会发生野指针错误。访问的是不改访问的内存。

}


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

    @autoreleasepool {
        Student *stu=[[[Student alloc] init] autorelease];   //在某个适当的时间释放就是说,不会马上释放掉,只会过一段时间后释放。
   
    }
    return 0;
}

 

【OC. 内存管理】retain和release,布布扣,bubuko.com

【OC. 内存管理】retain和release

标签:style   blog   color   使用   io   数据   ar   div   

原文地址:http://www.cnblogs.com/iflewless/p/3912604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!