oc内存的理解
oc中的内存管理,是靠引用计数器,只要计数器变成0就会回收
可以调用returnCount方法来返回计数器数
调用这个对象的copy,retain,new,alloc方法都可以将引用计数器+1
当调用这个对象的release方法这个方法可以将引用计数器-1
当一个对象快要被回收的时候会调用一个析构函数dealloc方法。一般要使用的时候,这个方法都会被复写下
当要复写这个dealloc方法的时候,最后还是要调用一下父类的dealloc方法的,感觉和重定义初始化方法要调用父类的init一样
-(void)dealloc{
//insert your code;
[super dealloc];
}
野指针就是访问了一块访问了一个不属于自己得内存,当堆空间被释放的时候,我们还用栈空间的指针来访问这块地址就会出错,(其中用什么来验证其指向的内存不属于自己的,还不了解)
当[[[Student alloc]init]autorelease]这是指将这个对象放到了自动释放池子,
当这个自动释放池被销毁的时候,池子里面的所有的对象都会调用一次release方法。
oc内存管理法则,谁污染谁治理,
当一个对象1要拥有一个对象的时候,可以在这个对象的setter函数里面调用一次这个对象的retain方法,引用计数器+1,
当这个对象1dealloc方法里面调用release方法
-(void)dealloc{
[_book release];书就是拥有的那个对象。
[super dealloc];
}
-(void)setBook:(Book *)newBook{
_book=[newBook retain];
}
@class Book;
这个关键字可以提高编译性能。//在.h文件中,才这样声明,但当要真正用到这个类的时候用import关键字导入,在.h文件中的父类必须是用import,因为继承必须要知道这个类到底又哪些方法和属性。
有这么一个情况,当2个类你中有我,我中有你,就必须用@class用#import会造成递归导入。
总结就是:.h文件中用@class,在.m文件中用#import。特殊情况,视情况而定。
静态方法的潜规则我们都将对象丢到自动释放池
比如有个Student这个类,
+(ID)studentWithAge:(int)age{
Student *stu=[[[self alloc]init]autorelease];
stu.age=age;
return stu;
}