每个对象都保存一个与之相关联的整数,称为计数器,当使用alloc,new,copy创建一个对象时,对象的计数器被设置为1,给对象发送一条retain消息,计数器加一,当给对象发送一条release消息,计数器减一,当计数器为0时,这个对象被销毁。retainCount获得计数器的值。谁创建谁释放,谁ratein谁release
如果是OC对象之间的调用@property(retain)Book * book;// @property有参数retain代表让编译器帮准管理内存
readonly代表只生成getter方法@property(nonatamic,readonly)int age;//只生成get方法
@property(nonatomic,getter=isRich) BOOL rich;//制定getter的方法名
nonatomic代表不考虑线程问题,以后都加上,因为默认是atomic是加锁的,造成系统浪费,iphone是小设备。
@property(nonatamic)int age;
@property(nonatomic,retain)Book * book;//这些一些自动生成get和set方法
@autoreleasePool自动释放池,按栈的方式存放,先进后出
Student *stu=[[Student alloc]init];
[stu autoralease];//当运行结束是自动调用一次release;也就是说如果计数器是2,stu将没有被释放。此举还等于Student* stu=[[ [Stduent alloc]int]autorelease];简单的说也是release的延迟,用autorelease自动释放方便了内存管理,还比较安全。静态方法返回的对象都是自动释放的,所以调用系统的静态方法不用管理内存。我们自己建立静态方法要用autorelease比较方便
+(id)student
{
Student *stu=[[[Student alloc] init] autorelease];
Return stu;
}
外面调用时用在释放内存,以为自动了。Student* stu=[Student student];
内存比较大的尽量少用autorelease自动释放池,自己手动写,不要把过的的自动释放写在一起,例如for循环中