内存管理

任何继承了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;
}

 

posted on 2014-08-14 15:15  ZiCheng  阅读(1748)  评论(0编辑  收藏  举报