内存管理
任何继承了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
时间: 2024-11-14 12:01:37