------- android培训、java培训、期待与您交流!
循环retain:
涉及到循环引用:身份证Card和人Person就是相互包含的
这个时候需要使用@class
使用:@class Card; 它在person.h中代替#import "Card.h"
他的作用仅仅是告诉编译器,Card是一个类
我倒是觉得这和java中配置数据库关系中,一对一,一对多,多对多的时候,需要告诉双方。
如果在点m文件中需要使用类对象的时候,再导入进来---------比如在dealloc方法中release
一般头文件中不用#import Car.h ,因为import的意思就是拷贝,如果改变Car.h,那么有100个类引用了Car.h就要再次拷贝100次,所以最好用@class
但有个特例,那就是父类一定要引用#import
1.@class作用:仅仅是告诉编译器,某个名称是一个类
@class Person
2.开发中引用一个类的规范:
>在点h头文件中,用@class来声明类
>在点m文件中用#import来包含类的所有东西
3.两端循环引用解决方案:
>一端用retain
>一端用assign-----计数器不变
autorelease:
1.会将对象放到一个自动释放池中
2.当自动释放池被销毁时,会对池子中所有对象做一次release操作
3.会返回对象本身
4.调用完autorelease方法后,对象计数器 不变
好处:
1.妈妈以后再也不用担心我必须把release写在最后面了
ios5.0后使用方式:
@autoreleasepool{
//开始创建释放池1
Person *p = [[[Person alloc] init] autorelease];
p.age = 10;
@autoreleasepool{
//池子2
}
//开始销毁释放池
} //到这之后Person销毁
可以创建无数个释放池,并且池子都是存放在栈中,先进后出
但这样不能准确控制时间,适合小对象
调用aurorelease只是将对象放到池子里面,对于对象计数器没有任何影响
使用错误注意:
1.要么使用autorelease 要么使用release,不能同时使用
2.不能多次调用:Person *p = [[[[Person alloc] init] autorelease] autorelease];
======================实际开发=========================
为了不用每一次都写很长的autorelease ,开发中常设计一个类方法(类名开头)返回autorelease对象
+ (id)person{
return [[[self alloc] init] autorelease]; //尽量使用self,这样可以满足子类的需求
}
+ (id)personWithAge:(int)age{
//Person *p = [Person person];/[self person];这一句代替下面一句
Person *p =[[[self alloc] init] autorelease];//这里的self好处很大哦,以后任何子类调用这个方法创建person子类对象,都会返回子类对象,而不是Person父类对象
p.age=age;
return p;
}
调用时:
Person *p = [Person person];
Person *p1 = [Person personWithAge:100]; //返回带有参数的类方法
规律:
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
NSString *str = @"123123"; //由于不是通过alloc,不用release,因为默认是autorelease
NSString *str2 = [NSString stringWithFormat:@"age is %d",10];
2.开发中设计一个返回autorelease对象的类方法,方法名以类名开始+With+
NSNumber *num = [NSNumber numberWithInt:100];
3.在父类中创建对象时不要直接用类名,一般用self,可以,满足子类需求