物件在執行時獲取其型別的能力稱為內省。內省可以有多種方法實現。
判斷物件型別
-(bool) iskindofclass: classobj判斷是否是這個類或者這個類的子類的例項
-(bool) ismemberofclass: classobj 判斷是否是這個類的例項
-(bool) respondstoselector: selector判讀例項是否有這樣方法
+(bool) instancesrespondtoselector: 判斷類是否有這個方法。此方法是類方法,不能用在類的物件
2.1 respondstoselector的使用
-(void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary*)change context:(void *)context
}kvc
除了一般的賦值和取值的方法,我們還可以用key-value-coding(kvc)鍵值編碼來訪問你要訪問的類的屬性。
@class
course;
@inte***ce student : nsobject
@end
實現還是什麼都沒有,這裡就不貼**了
在main方法中,我們實驗通過鍵路徑訪問course中coursename的屬性
[cpp]view plain
copy
#import "student.h"
#import "course.h"
intmain(
intargc,
const
char
* argv)
return
0;
}
**塊(block)
void(^printblock)(nsstring * x);
printblock = ^(nsstring * str)
printblock(@"liuxiaomin『scode");
**塊實現陣列排序:
nsarray * strarray = [nsarray arraywithobjects:@"aa1",@"bb2",@"cc3"];
nscomparator sortblock = ^(id string1, id string2)
nsarray * sortarray = [stringarray sortedarrayusingcomparator:sortblock];
nslog(@"sortarray:%@",sortarray);
**塊的遞迴呼叫
static void (^ const blocks)(int) = ^(int i)
}在**塊中:
而區域性變數可以使用,但是不能改變。
在**塊中改變區域性變數編譯不通過。怎麼在**塊中改變區域性變數呢?在區域性變數前面加上關鍵字:__block
nsenumerator * enmuerator = [array objectenummerator];
id object;
while(object = [enmmuerator nextobject]])
[ obj release];
自動釋放池
自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...
自動釋放池
autorelease本質上就是延遲呼叫release方法 autorelease物件什麼時候釋放?引用計數為0的時候才會釋放,不是出了pool就釋放 在一些很消耗記憶體的迴圈呼叫的場景下有時需要手動干預autoreleased物件的釋放時機,不然會導致記憶體暴增,最終導致程式崩潰 nsthread...
自動釋放池
自動釋放池是允許你放棄對乙個物件的持有關係,但可以避免它立即被 的乙個工具,當從方法返回你的物件的時候,這個功能很有用。1 程式的入口處於在main 函式 這就意味著整個應用都在自動釋放池中,所有的物件最後都會被 int main int argc,char argv 2 autoreleasepo...