總結(型別判斷,釋放池,類別,kvo)

2021-07-09 04:11:57 字數 1641 閱讀 3849

物件在執行時獲取其型別的能力稱為內省。內省可以有多種方法實現。

判斷物件型別

-(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...