iOS 讀書筆記 第一章

1.肯定某個實例或類方法是否可用。算法

  1)使用NSObject的類方法instancesRespondToSelector:來肯定是否在該類的一個實例中存在一個特定的選擇器。編程

    NSArray *array = @[@"1",@"2"];
    
    if ([NSArray instancesRespondToSelector:@selector(sortUsingComparator:)]) {
        //do something use sortUsingComparator:
        
    }else if ([NSArray instancesRespondToSelector:@selector(sortUsingFunction:context:)]) {
        //do something use sortUsingFunction:context:
        
    }else {
        
    }
    
    //或者能夠使用
    if ([array respondsToSelector:@selector(sortUsingComparator:)]) {
        //do something use sortUsingComparator:
        
    }else if ([array respondsToSelector:@selector(sortUsingFunction:context:)]) {
        //do something use sortUsingFunction:context:
        
    }else {
        
    }

2.在運行時肯定某個類是否可用數組

  1)使用NSClassFormString函數。能夠你要使用的類名稱做爲字符串傳遞給此方法。若是此函數返回值爲0,則此設備中此類不可用;不然可用。ide

    

    if (NSClassFromString(@"NSJSONSerialization") != nil) {
        //能夠使用

    }else {
        //不可以使用
        
    }

3.NSSet與NSArray區別函數

  NSSet到底什麼類型,其實它和NSArray功能性質同樣,用於存儲對象,屬於集合; NSSet  , NSMutableSet類聲明編程接口對象,無序的集合,在內存中存儲方式是不連續的,不像NSArray,NSDictionary(都是有序的集合)類聲明編程接口對象是有序集合,在內存中存儲位置是連續的;atom

      NSSet和咱們經常使用NSArry區別是:在搜索一個一個元素時NSSet比NSArray效率高,主要是它用到了一個算法hash(散列,也可直譯爲哈希);開發文檔中這樣解釋:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.spa

  NSSet中一個對象只容許添加一次。第二次嘗試添加相同的對象,它將會拒絕。orm

好比你要存儲元素A,一個hash算法直接就能直接找到A應該存儲的位置;一樣,當你要訪問A時,一個hash過程就能找到A存儲的位置。而對於NSArray,若想知道A到底在不在數組中,則須要便利整個數組,顯然效率較低了;對象

      NSSet,NSArray都是類,只能添加cocoa對象,若是須要加入基本數據類型(int,float,BOOL,double等),須要將數據封裝成NSNumber類型。blog

  其中 containsObject:  方法 支持通常類型。若是想要支持自定義的類,要重載該類的 - (BOOL)isEqual:(id)object;方法。

例如:

  

#import <Foundation/Foundation.h>

@interface RRPDemoClass : NSObject {
    
    NSString    *name;
    NSNumber    *age;
}

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;

@end

#import "RRPDemoClass.h"

@implementation RRPDemoClass

@synthesize name;
@synthesize age;

- (BOOL)isEqual:(id)object {
    
    if (![object isKindOfClass:[RRPDemoClass class]]) {
        return NO;
    }
    RRPDemoClass *a = (RRPDemoClass *)object;
    BOOL result = NO;
    result = [self.name isEqualToString:a.name];
    if (!result) {
        return result;
    }
    result = [self.age integerValue] == [a.age integerValue] ? YES : NO;
    return result;
}

@end
相關文章
相關標籤/搜索