【语法】【内存管理】retain和release

内存管理

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

原理

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

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

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

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

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

 

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

Student.h
【语法】【内存管理】retain和release
//
//  Student.h
//  retain release的简单实用
//
//  Created by 裴烨烽 on 14-1-26.
//  Copyright (c) 2014年 裴烨烽. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property int age;

@end
【语法】【内存管理】retain和release
Student.m
【语法】【内存管理】retain和release
//
//  Student.m
//  retain release的简单实用
//
//  Created by 裴烨烽 on 14-1-26.
//  Copyright (c) 2014年 裴烨烽. All rights reserved.
//

#import "Student.h"

@implementation Student

@synthesize age=_age;

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


@end
【语法】【内存管理】retain和release
main.m
【语法】【内存管理】retain和release
//
//  main.m
//  retain release的简单实用
//
//  Created by 裴烨烽 on 14-1-26.
//  Copyright (c) 2014年 裴烨烽. All rights reserved.
//

#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; }
【语法】【内存管理】retain和release

【语法】【内存管理】retain和release

上一篇:CCCallFuncN误用导致引用计数循环引用


下一篇:Acwing-----187. 导弹防御系统