五.oc的语法基础(内存管理上)
1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1.
*给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身)
*给对象发一条release消息,则计数器的值-1
*可以给对象发送retaincount消息来获取当前引用计数器的值
*当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super dealloc]方法,且该方法必须放在最后
*不要直接调用的dealloc方法
*以后凡是见到retain就要用release,见到alloc就要用release。
以上是部分内存管理的内容遵循的原则就是“谁污染,谁治理,谁创建,谁销毁的原则”,下面我自己谢了一个非ARC形式的程序,大家认真读一下
main.m
#import <Foundation/Foundation.h> #import "Perosn.h" #import "Student.h" #import "Book.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu=[Student new];//stu=1 Book *book=[Book new];//book=1 stu.book=book;//book=2 stu=1 book.stu=stu;//book=2 stu=1 [book release];//book=1,stu=1 [stu release];//book=1,stu=0; } return 0; }
Person.h
#import <Foundation/Foundation.h> @interface Perosn : NSObject @property (nonatomic,assign) int age; @end
Person.m
#import "Perosn.h" @implementation Perosn -(void)dealloc { NSLog(@"Person 对象被释放了!!!!"); [super dealloc]; } @end
Student.h
#import "Perosn.h" @class Book; @interface Student : Perosn @property (nonatomic,retain) Book *book; @property (nonatomic,assign) int no; @end
Student.m
#import "Student.h" #import "Book.h" @implementation Student -(void)dealloc { [_book release];//book= 0; stu=0; NSLog(@"Student 对象被释放了!!!!"); [super dealloc]; } @end
Book.h
#import <Foundation/Foundation.h> #import "Student.h" @interface Book : NSObject { Student *_stu; } - (void)setStu:(Student *)stu; - (Student *)stu; @end
BOOK.m
#import "Book.h" @implementation Book -(void)setStu:(Student *)stu { // if(_stu!=stu) // { // [_stu release]; // _stu=[stu retain]; // } _stu=stu; } -(Student *)stu { return _stu; } -(void)dealloc { NSLog(@"Book 对象被释放了!!!!"); [super dealloc]; } @end
每当引用了一个对象类型的数据计数器的值就会+1,每当释放一个对象,对象计数器的值-1。
2.野指针,出现野指针的根本原因在于对象是存放在堆中,而指针是存放在栈中的,所以当引用计数器的值为0的时候,对象释放了,但是这是指向这个对象的指针还在,所以 就出现了,指向一个对象的指针是不可用的。出现错误
所以一把呢解决方法是p=nil什么时候用完了就释放指针,因为oc中空指针调用方法,不产生任何效果,也不会出现任何错误,所以说不会出错
3.当使用非ARC机制是成员变量的set方法的写法:
#import "Car.h" @implementation Car - setCar:(Car *)car { if (car!=_car) { [_car release]; _car=[car retain]; } } - (void)dealloc { [_car release]; [super dealloc]; } @end
以上是就是非ARC机制下的内存管理,认真阅读你将受益匪浅。
时间: 2024-12-15 06:52:56