------- 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,可以,滿足子類需求