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,则此设备中此类不可用;否则可用。

    

    if (NSClassFromString(@"NSJSONSerialization") != nil) {
        //可以使用

    }else {
        //不可使用
        
    }

3.NSSet与NSArray区别

  NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet  , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;

      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.

  NSSet中一个对象只允许添加一次。第二次尝试添加相同的对象,它将会拒绝。

比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了;

      NSSet,NSArray都是类,只能添加cocoa对象,如果需要加入基本数据类型(int,float,BOOL,double等),需要将数据封装成NSNumber类型。

  其中 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

  

      

posted @ 2014-07-26 15:50  一切的眷恋  阅读(364)  评论(0编辑  收藏  举报