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

  

      

最新文章

  1. 一个无限加载瀑布流jquery实现
  2. Be careful about the upper limit of integer
  3. Python模块之day4
  4. Array 、 Dictionary 、 Object 3大数据结构 以及 for ... in for each的研究
  5. [系统开发] Django Admin上传图片简单校验
  6. JAVA基础知识之多线程——线程池
  7. iOS 应用有用户评论功能 因为潜在色情信息被退回解决方案
  8. Sql的实际应用
  9. Override ListView getAdapter造成的后果
  10. Transparency Tutorial with C# - Part 1
  11. [TYVJ] P1044 数字三角形
  12. 20151113--JSTL
  13. Xamarin 安装步骤
  14. Lloyd’s 算法 和 K-Means算法
  15. 雷达无线电系列(一)几种常见的幅度分布函数(matlab)
  16. 全平台网页播放器兼容H5与Flash还带播放列表
  17. windows pm2 启动nodejs失败:Error: EBADF: bad file descriptor, uv_pipe_open
  18. eclipse jee使用
  19. thinkphp5中如何使用 usort
  20. Python核心编程的四大神兽

热门文章

  1. shell脚本,当用sed删除某一文件里面的内容时,并追加到同一个文件会出现问题。
  2. PAT 乙级 1033
  3. FTP实验报告
  4. logstash-基础操作
  5. Web安全XSS、CSRF和SQL注入
  6. leepcode - 5-16
  7. UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe6 in position 287: ordinal not in range(128)
  8. LeetCode(90) Subsets II
  9. LeetCode(1)Two Sum
  10. GYM 101350 G