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