OC學習篇之---Foundation框架中的NSObject對象 分類: IOS 2014-12-07 16:06 2093人閱讀 評論(0) 收藏

前一篇文章講到了OC中的代理模式:http://blog.csdn.net/jiangwei0910410003/article/details/41777627,並且前幾篇文章就介紹了OC中的類相關知識,從這篇文章開始咱們開始介紹Foundation框架。java

OC中的Foundation框架是系統提供了,他就至關因而系統的一套api,和Java中的一些系統jar很類似,又早起的一批人開發的,內部有不少現有的類和功能提供給咱們使用。那麼今天首先來介紹一下Foundation框架中的第一個類NSObjectapi

在以前介紹了類的相關知識,咱們看到咱們自定義的類都必須實現NSObject類,這個類內部有不少現有的方法能夠供咱們使用,好比咱們常用的alloc和init方法,就是NSObject提供的,下面就在來看一下他的一些其餘經常使用方法:框架


經過代碼來演示每一個方法的做用:oop

Person.hpost

//
//  Person.h
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)invoke;

@end


Person.m

//
//  Person.m
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)invoke{
    NSLog(@"invoke is Executing...");
    [self demo1];//對象調用
    
    //performSelector方法調用
    NSString *result = [self performSelector:@selector(demo1)];
    NSLog(@"%@",result);
    
    //調用有一個參數的方法
    [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
    
    //調用有兩個參數的方法
    [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
    
    //延遲調用一個方法
    //此處的延遲調用,代碼不會停留在此處,爲了避免阻塞線程
    [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
    
    //若是沒有如下代碼的話,上面的延遲調用就不會有效果的,由於他不會阻塞當前線程,因此當前線程中後續的代碼會繼續執行
    //在main.m中得main方法中,會直接return,這樣程序就運行結束了,因此來不及執行2.5s以後方法執行
    //如下代碼讓執行過程停在此處
    [[NSRunLoop currentRunLoop] run];
    
}

- (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);
}

@end

main.m
//
//  main.m
//  13_NSObjectMethod
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Person.h"

//isEqual判斷兩個指針是否指向同一個對象

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //1.--------------------isEqual方法
        NSObject *obj1 = [[NSObject alloc] init];
        NSObject *obj2 = [[NSObject alloc] init];
        
        if([obj1 isEqual:obj2]){
            NSLog(@"obj1 == obj2");
        }else{
            NSLog(@"obj1 != obj2");
        }
        
        //或者直接用等號判斷
        if(obj1 == obj2){
            //do something...
        }else{
            //do something...
        }
        
        
        //2.--------------------performSelector方法
        //調用invoke方法
        //延遲調用某一個方法
        Person *p = [[Person alloc] init];
        [p performSelector:@selector(invoke)];
        
        //3.--------------------isKindOfClass和isMemberOfClass方法
        Person *rose = [[Person alloc] init];
        //判斷rose是否屬於Person類建立的
        //BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
        BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
        if(isBelongTo == YES){
        }else{
        }
        
        //判斷rose是否屬於子類建立的
        //判斷一個類是否是一個類的子類
        isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO
        
        
        //4.---------------------respondsToSelector方法
        //判斷類中是否有特定的方法(有實現的方法所有返回YES,若是隻在.h文件中定義了,返回的是NO)
        //同時這種方式能夠實現調用所謂的私有方法
        Person *task = [[Person alloc] init];
        isBelongTo = [task respondsToSelector:@selector(invoke)];
        if(isBelongTo){
        }else{
        }
        
    }
    return 0;
}


下面來一一介紹一下方法的做用

一、isEqual方法spa

//1.--------------------isEqual方法
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
        
if([obj1 isEqual:obj2]){
     NSLog(@"obj1 == obj2");
}else{
     NSLog(@"obj1 != obj2");
}
        
//或者直接用等號判斷
if(obj1 == obj2){
     //do something...
}else{
     //do something...
}

他的做用就是判斷兩個指針變量是否指向同一個對象,在OC中他還有一個簡單的用法,就是直接使用"=="來進行比較,這兩個效果是同樣的,可是在Java中是不一樣的,Java中的"=="是判斷兩個引用變量是否指向同一個對象,可是其equals方法是判斷兩個對象的值是否相等(這裏的值指的是基本類型,其餘對象類型,能夠重寫這個方法來進行操做)。.net


二、isMemberOfClass方法線程

//3.--------------------isKindOfClass和isMemberOfClass方法
Person *rose = [[Person alloc] init];
//判斷rose是否屬於Person類建立的
//BOOL isBelongTo = [rose isMemberOfClass:[Person class]];//返回YES
BOOL isBelongTo = [rose isMemberOfClass:[NSObject class]];//返回NO
if(isBelongTo == YES){
}else{
}
這個方法的做用是判斷一個指針變量指向的對象是否是屬於一個類建立的,相似於Java中的obj.getClass()==Person.class效果。


三、isKindOfClass方法代理

//判斷rose是否屬於子類建立的
//判斷一個類是否是一個類的子類
isBelongTo = [rose isKindOfClass:[NSObject class]];//返回NO
這個方法的做用是判斷一個指針變量指向的對象是否是一個類的子類,相似於Java中的instanceof關鍵字的做用


四、respondsToSelector方法指針

//4.---------------------respondsToSelector方法
//判斷類中是否有特定的方法(有實現的方法所有返回YES,若是隻在.h文件中定義了,返回的是NO)
//同時這種方式能夠實現調用所謂的私有方法
Person *task = [[Person alloc] init];
isBelongTo = [task respondsToSelector:@selector(invoke)];
if(isBelongTo){
}else{
}
這個方法咱們在以前的文章中使用過了,他的做用就是判斷一個類中是否有某個方法,他的判斷是隻要這個方法有實現,就返回YES

若是隻在.h文件中定義了,沒有在.m文件中實現的話,也是返回NO的

若是這個方法沒有在.h文件中定義,可是在.m文件中有實現的話(私有方法),返回YES

只要方法在.m文件中有才會返回YES

這個方法的功能若是在Java中可使用反射去實現


五、performSelector方法

- (void)invoke{
    NSLog(@"invoke is Executing...");
    [self demo1];//對象調用
    
    //performSelector方法調用
    NSString *result = [self performSelector:@selector(demo1)];
    NSLog(@"%@",result);
    
    //調用有一個參數的方法
    [self performSelector:@selector(demo2:) withObject:@"jiangwei"];
    
    //調用有兩個參數的方法
    [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
    
    //延遲調用一個方法
    //此處的延遲調用,代碼不會停留在此處,爲了避免阻塞線程
    [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
    
    //若是沒有如下代碼的話,上面的延遲調用就不會有效果的,由於他不會阻塞當前線程,因此當前線程中後續的代碼會繼續執行
    //在main.m中得main方法中,會直接return,這樣程序就運行結束了,因此來不及執行2.5s以後方法執行
    //如下代碼讓執行過程停在此處
    [[NSRunLoop currentRunLoop] run];
    
}

- (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);
}

這個方法的做用就是調用對象中的一個方法,看到上面的例子,這個方法有不少樣式:

無參數樣式

[self performSelector:@selector(demo1)]


一個參數的樣式

//調用有一個參數的方法
[self performSelector:@selector(demo2:) withObject:@"jiangwei"];


兩個參數樣式

//調用有兩個參數的方法
[self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];


可是咱們看到上面的調用方式,感受不到這個方法的用途,由於咱們徹底能夠直接調用demo1方法

[self demo1]


在看看他的一種樣式

//延遲調用一個方法
//此處的延遲調用,代碼不會停留在此處,爲了避免阻塞線程
[self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
能夠延遲的調用一個方法,這纔是該方法的核心做用,他的做用相似於Android中的postDelayed(Runnable runable)方法,一樣,這個方法會在後面UI使用中常用到,可以延遲的調用一個方法。


同時他還有一個做用能夠直接調用一個類的私有方法,即只在.m文件中實現了的方法:

Person *task = [[Person alloc] init];
isBelongTo = [task respondsToSelector:@selector(demo1)];
if(isBelongTo){
    [task performSelector:@selector(demo1)];
     NSLog(@"YES");
}else{
     NSLog(@"NO");
}
他回常常結合respondsToSelector方法一塊兒使用,這裏demo1就是一個私有的方法,若是在Java中須要用到反射,而後還要強暴一下這個私有方法才能調用。在OC中的實現就簡單了。


總結

這篇文章就介紹了OC中的Foundation框架中的NSObject對象中的一些經常使用方法。

相關文章
相關標籤/搜索