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