首页 > 代码库 > iOS 读书笔记 第一章

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