官术网_书友最值得收藏!

4.9 動態(tài)處理類和對象

使用各種各樣的機(jī)器人對象時,可能需要判斷它們的功能,這時,就需要動態(tài)判斷對象或類是否支持所需要的方法,這些操作都可以通過NSObject類中定義的一系列方法來實(shí)現(xiàn),由于我們創(chuàng)建的類最終都會以NSObject類為終級父類,所以,我們可以在所有類中使用這些方法。

接下來,我們就討論一些常用的方法。

■4.9.1 對象類型判斷

本節(jié)將介紹對象類型判斷相關(guān)的方法。

1.對象是否為某類的實(shí)例

需要判斷一個對象是不是某個類的實(shí)例時,可以使用如下方法。

    -(BOOL) isMemberOfClass:classObject;

我們可以看到,isMemberOfClass:定義為一個實(shí)例方法,其中,參數(shù)classObject為類對象,可以使用class類方法獲取,如“[CRobot class]”。

下面的代碼將判斷一個對象是不是CRobot類的實(shí)例(對象)。

    CRobot *robot5 = [[CRobot alloc] init];
    BOOL result = [robot5 isMemberOfClass:[CRobot class]];

2.對象是否為某類或其父類的實(shí)例

判斷一個對象是不是某個類或其父類的實(shí)例,可以使用isKindOfClass:方法,它同樣定義為實(shí)例方法,其定義如下。

    -(BOOL) isKindOfClass:classObject;

下面的代碼演示了isKindOfClass:方法的使用。

    CRobotSoldier *killer = [[CRobotSoldier alloc] init];
    BOOL result = [killer isKindOfClass:[CRobot class]];

由于CRobotSoldier是CRobot的子類,所以,result的值也是YES。

3.判斷類的繼承關(guān)系

類方法isSubclassOfClass可以判斷一個類是不是某個類的子類。

    +(BOOL) isSubclassOfClass:classObject;

下面的代碼,會判斷CRobotSoldier類是否為CRobot類的子類。

    BOOL result = [CRobotSoldier isSubclassOfClass:[CRobot class]];

■4.9.2 方法存在判斷

在類中定義的方法分為實(shí)例方法和類方法,我們分別使用如下兩個方法進(jìn)行判斷類或?qū)ο笾惺遣皇强梢允褂弥付ǖ姆椒ā?/p>

判斷實(shí)例方法是否存在,我們使用respondsToSelector方法,其定義如下。

    -(BOOL) respondsToSelector:selector;

其中的參數(shù)selector為SEL類型(選擇器類型),我們使用@selector(<方法名>)獲取沒有參數(shù)的方法的SEL類型對象。

下面的代碼會判斷CRobot類型的對象中是否可以使用work方法。

    CRobot *robot5 = [[CRobot alloc] init];
    BOOL result = [robot5 respondsToSelector:@selector(work)];

如果我們需要判斷的方法包含參數(shù),那么,在@selector()指令中只需要包括方法名、參數(shù)名稱和冒號即可,并不需要指定參數(shù)變量。

判斷一個類是否包含類方法時,可以使用如下方法。

    +(BOOL) instancesRespondToSelector:selector;

其使用與respondsToSelector:方法類似。

■4.9.3 動態(tài)調(diào)用方法

如果我們需要動態(tài)調(diào)用方法,可以使用如下三個實(shí)例方法,分別用于調(diào)用無參數(shù)、一個參數(shù)和兩個參數(shù)的方法。

    -(id) performSelector:selector;
    -(id) performSelector:selector withObject:object;
    -(id) performSelector:selector withObject:object1 withObject:object2;

這幾個方法都會返回id類型的數(shù)據(jù),它們是所調(diào)用方法的返回結(jié)果。

下面的代碼就調(diào)用了CRobot對象中的move方法,此方法沒有返回值,所以,我們也不需要處理performSelector:方法的返回值。

    CRobot *robot5 = [[CRobot alloc] init];
    robot5.name = @"No.5";
    [robot5 performSelector:@selector(move)];
主站蜘蛛池模板: 忻城县| 潜江市| 大冶市| 洛川县| 习水县| 屯昌县| 桑日县| 志丹县| 新化县| 休宁县| 黔南| 会东县| 平阴县| 边坝县| 揭西县| 延边| 衡阳市| 庆元县| 古浪县| 韶山市| 湟源县| 浙江省| 南江县| 乐昌市| 莫力| 海盐县| 莱州市| 阳江市| 革吉县| 聂拉木县| 宁海县| 铅山县| 桐柏县| 张家川| 教育| 牙克石市| 泰和县| 巴东县| 应用必备| 珲春市| 磐石市|