1. 程式人生 > >OC學習四-----NSObject中常用方法

OC學習四-----NSObject中常用方法

isEqual方法:判斷兩個指標變數是否指向同一個物件

NSObject *obj1 = [[NSObject alloc] init];
NSOBject *obj2 = [[NSObject alloc] init];
if([obj1 isEqual:obj2]){//也可直接用 == 判斷
    NSLog(@"obj1 == obj2");
}else{
    NSLog(@"obj1 != obj2");
}

OC中直接使用 == 來進行比較和使用 isEqual方法,效果是一樣的,但是在Java中是不同的,Java中“==”是判斷兩個引用變數是否指向同一個物件,但是equal方法是判斷兩個物件的值是否相等,這裡的值是指基本資料型別,其他物件型別,可以重寫這個方法來進行操作。

isMemberOfClass方法

Person *psrson = [[Person alloc] init];
Bool isBelongTo = [parson isMemberOfClass:[NSObject class]];//返回NO
//Bool isBelongTo = [parson isMemberOfClass:[Person class]];//返回YES
if(isBelongTo == YES){
}else{
}

這個方法的作用是判斷一個指標變數指向的物件是不是屬於一個類建立的,類似於Java中的
obj.getClass() == Person.class效果。

isKindOfClass方法

isBelongTo = [person isKindOfClass:[NSObject class]];//返回YES

用來判斷某個物件是否屬於某個類,或者屬於某個類的派生類。
可以用來判斷出所有了都是基於NSObject類的事實。isMemberOfClass不可以。

respondsToSelector方法

//判斷類中是否有特定的方法
Person *person = [[Person alloc] init];
isBelongTo = [person respondToSelector:@selector(invoke)];

判斷一個類中是否有某個方法,他的判斷是隻要這個方法有實現,就返回YES
如果在.h檔案中定義了,沒有在.m檔案中實現的話,返回NO
如果這個方法沒有在.h檔案中定義,但是在.m檔案中有實現的話(私有方法),返回YES
只要在.m檔案中有才會返回YES
在Java中可以使用反射實現

performSelector方法

-(NSString *)demo1{
    NSLog(@"demo1");
    return @"demo1";
}
-(void)demo2:(NSString *)str{
    NSLog(@"str = %@",str);
}
-(void)demo3:(NSString *)str withName:(NSString *)name{
    NSLog(@"str =  %@,name = %@",str,name);
}

-(void)invoke{
    [self demo1];//直接物件呼叫
    //performSelector方法呼叫
    NSString *result = [self performSelector:@selector(demo1)];
    //performSelector呼叫一個引數的
    [self performSelector:@selector(demo2:) withObject:@"str內容"];
    //呼叫兩個引數的
    [self performSelector:@selector(demo3:) withObject:@"str內容" withObject:@"name內容"];

    //延時呼叫一個方法,此處的延時呼叫,程式碼不會停留在此處,為了不阻塞執行緒
    [self performSelector:@selector(demo1) wothObject:Null afterDelay:2.5];
    //如果沒有一下程式碼,上面的延時呼叫就沒有效果,因為他不會阻塞當前想成
    //所以當前執行緒中後續的程式碼會繼續執行,在main.m中的main方法中,會直接ruturn,這樣程式就執行結束了
    //以下程式碼會讓程式碼執行過程停在此處
    [[NSRunLoop currentRunLoop] run];
}

performSelector方法有很多樣式,可以呼叫無引數的,一個引數的、兩個引數的等,這些用處不大,因為我們可以直接呼叫demo1、demo2、demo3方法,不需要通過performSelector方法呼叫
但是performSelector方法有一個延遲呼叫的功能,這個是其核心作用,類似於Android中的postDelayed(Runnable runable)方法。同時這個方法還可以直接呼叫一個類的私有方法,即只在.m檔案中實現了的方法

Person *person = [[Person alloc] init];
isBelongTo = [person respondsToSelector:@selector(demo1)];
if(isBelongTo){
    [person performSelector:@selector(demo1)];
}else{}

performSelector方法經常會和respondsToSelector方法一起使用,治理的demo1就是一個私有方法,如果在Java中需要用到反射才可以。OC中實現就很簡單。