高级语法精讲

一、NSSet、NSMutableSet集合的介绍

1)NSSet、NSMutableSet集合,元素是无序的,不能有重复的值。

2)用实例方法创建一个不可变集合对象

例如:

//宏定义
#define TOBJ(n) [NSNumber numberWithInt:n]
NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];

2)用类方法创建一个不可变集合对象 例如:

1 NSSet *set2=[NSSet setWithObjects:TOBJ(2),TOBJ(4),TOBJ(6), nil];

3)NSSet 快速遍历方法(无序,所以没有下标)例如:

1  for(id num in set1){
2     NSLog(@"%@",num);
3 }

4)setSet 用于修改集合内容 例如:[mSet setSet:set1];

5)intersectSet 用于获取两个集合的交集(返回两个集合中相同的元素)。例如:

#define TOBJ(n) [NSNumber numberWithInt:n]
NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];
NSSet *set2=[NSSet setWithObjects:TOBJ(2),TOBJ(4),TOBJ(6), nil];
[mSet intersectSet:set2];
NSLog(@"intersect:%@",mSet); //结果:2

6)unionSet 用于获取两个集合的并集(返回两个集合中所有的元素,如果重复只显示其中一个) 例如:

1 #define TOBJ(n) [NSNumber numberWithInt:n]
2 NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];
3 NSSet *set2=[NSSet setWithObjects:TOBJ(2),TOBJ(4),TOBJ(6), nil];
4 [mSet intersectSet:set2];
5 NSLog(@"intersect:%@",mSet); //结果:123456

7)minusSet 用于获取两个集合的差集 例如:

1 #define TOBJ(n) [NSNumber numberWithInt:n]
2 NSSet * mSet =[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];
3 NSSet *set2=[NSSet setWithObjects:TOBJ(2),TOBJ(4),TOBJ(6), nil];
4 [mSet minusSet:set2];
5 NSLog(@"intersect:%@",mSet); //结果:13456

8)allObjects 用于将集合转换为数组 例如:

1 #define TOBJ(n) [NSNumber numberWithInt:n]
2 NSSet * mSet =[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];
3 NSArray *array= [mSet allObjects];

9)anyObject 取set中任意一个元素(如果set中只有一个元素,取值)

1 #define TOBJ(n) [NSNumber numberWithInt:n]
2 NSSet * mSet =[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil];
3 id value=[mSet anyObject];

二、NSIndexSet、NSMutableIndexSet 可变索引集合的介绍

1)索引集合,表示唯一的整数的集合,有可变和不可变之分。

2)initWithIndexesInRange 用指定的范围对应的索引创建索引对象 例如:

1 NSIndexSet *indexSet1=[[NSIndexSet alloc]initWithIndexesInRange:
2 NSMakeRange(2,   3)];//结果 2,3,4

3)objectsAtIndexes 根据索引集合中的索引取出数组中对应的元素(返回数组) 例如:

1 NSIndexSet *indexSet1=[[NSIndexSet alloc]initWithIndexesInRange:NSMakeRange(2,   3)];
2 NSArray *array=@[@"one",@"two",@"three",@"four",@"five",@"sex"];
3 NSArray *array2=[array objectsAtIndexes:indexSet1];
4 NSLog(@"array2:%@",array2); //结果:array2:three four five

4)创建一个可变的集合索引(初始化时有一个索引)(可以存储不连续的索引值) 例如:

1 NSMutableIndexSet *indexSet2=[NSMutableIndexSet indexSetWithIndex:2];
2 [indexSet2 addIndex:4];
3 [indexSet2 addIndex:1];
4 [indexSet2 addIndex:2];
5 NSLog(@"count:%ld",indexSet2.count);//获取个数
6 NSArray *array3=[array objectsAtIndexes:indexSet2];//结果:two three  five

5)NSNull:类表示空, 只有一个类方法[NSNull null]获取空对象,在数组中nil表示元素结束(不能用nil表示空元素

可采用[NSNull null]表示空元素) 例如:

1 NSArray *array5=[NSArray arrayWithObjects:@"red",[NSNull null],@"yellow",@"blue", nil];

三、Category 介绍

1)Category 意为: 类别、分类、类目

1、可以在不改变类名的情况下,扩充类的功能(给类增加方法)

2、可以将类的功能拆成多个文件编译

3、类别中不能增加成员变量,可以访问原来类中的成员变量

4、类别中可以增加与原来类中同名的方法,调用时优先调用

5、添加文件时选择Objective-C File 那个文件同时注意选择要拓展的类名

2)类别的声明类似于类的声明,@interface要扩充功能的类名(类别名)

1、类别不能实例化对象

2、类别中不能增加成员变量。

3、类别中的方法可以访问原来类中的成员变量

4、类别可以调用原来类中的方法

5、类别中的方法可以被子类继承

6、类别可以添加与原来类中相同的方法,调用时类别中的方法优先调用,一般不建议这样操作(无法再调用原来类中的方法)

3)字符串、NSNumber是簇类,底层是由很多类组成的,不能有子类 ,因为子类调用不了父类中的方法

4)Category 文件名格式为:父类文件名+子类文件名 如:NSMutaleString+Resvrse.h

5)Category .m文件中的方法表现形式: 1 @implementation NSMutableString (Reverse)

四、Extension 的介绍

1)extension:相当于未命名的Category,可以扩展类的功能(增加方法),也可以增加成员变量。

2)extension:只有.h文件

3)extension  表现形式 @interface 类名()例如: 1 @interface Person (){}

4)在.m文件中也可以声明成员变量,不会将其放在接口h文件中暴露给使用者。 例如:

1 @interface Person()
2 {
3     int _num;
4 }
5 //将方法声明为私有的
6 -(void)print2;
7 @end

五、SEL的介绍

1)SEL是一种类型,将方法名封装为sel的变量,通过SEL找到方法的地址,调用方法。

2)SEL 封装方法实例代码:

1  //将play方法名封装成SEL类型的数据
2 SEL sel=@selector(play);
3  //判断p1所属的类是否实现了sel中的方法
4 if([p1 respondsToSelector:sel]){
5  //p1查找sel中方法的地址,再调用对应的方法
6 [p1 performSelector:sel];
7  }

3)performSelector 用于执行SEL封装的方法 例如: 1 [p1 performSelector:@selector(jump)];

4)SEL 封装带参数的方法实例代码:

1  //将带一个参数的方法封装为SEL的变量,执行,参数是id类型
2  [p1 performSelector:@selector(print:) withObject:@"hello"];

5)NSSelectorFromString 用于将字符串形式的方法名封装成SEL的数据 实例代码:

1  SEL sel2=NSSelectorFromString(@"study");
2  [p1 performSelector:sel2];

6)_cmd 表示当前执行的方法 例如: 1NSLog(@"*****metheod:%@",NSStringFromSelector(_cmd));

7)在C语言中 __func 表示获取当前执行方法 例如: 1 NSLog(@"func=%s",__func__);

__DATE__ 表示获取当前系统时间  1 NSLog(@"date=%s",__DATE__);

8)SEL实现数组排序 实例代码:

1 void testSel()
2 {
3     Person *p1;
4     Person *p2;
5     Person *p3;
6     NSMutableArray *array1=[[NSMutableArray alloc]initWithObjects:p1,p2,p3, nil];
7     [array1 sortUsingSelector:@selector(comparePerson:)];
8
9 }

六、构造OC中的二维数组

实例代码:

//创建一个空的外层数组
 2         NSMutableArray *bigArray=[NSMutableArray array];
 3         //创建一个存放4个数据对象的数组
 4         NSMutableArray *array1=[[NSMutableArray alloc]init];
 5         for(int i=0;i<4;i++){
 6             [array1 addObject:[NSNumber numberWithInt:i]];
 7         }
 8         //创建一个存放3个字符串的数组
 9         NSMutableArray *array2=[[NSMutableArray alloc]init];
10         for(int i=0;i<3;i++){
11             [array2 addObject:[NSString stringWithFormat:@"str%d",i+1]];
12         }
13         //将array1和array2两个数组对象存入外层数组(相当于创建了一个二维数组)
14         [bigArray addObject:array1];
15         [bigArray addObject:array2];
16
17         //遍历,显示所有的元素
18         for(int i=0;i<bigArray.count;i++){
19             for(int j=0;j<[bigArray[i] count];j++){
20                 //取出数组中第i行第j列的元素(每行又是一个数组对象)
21                 if([bigArray[i][j] isKindOfClass:[NSNumber class]]){
22                     NSLog(@"number:%@",bigArray[i][j]);
23                 }
24                 else if ([[[bigArray objectAtIndex:i] objectAtIndex:j] isKindOfClass:[NSString class]]){
25                     NSLog(@"string:%@",[[bigArray objectAtIndex:i] objectAtIndex:j]);
26                 }
27             }
28         }

七、Class (类)的介绍

1)类的本质也是一个对象,是Class类型的对象,获取类对象(可以通过实例方法或类方法获取),

每个类只有一个类对象。

2)load 方法当程序启动时会加载所有的类和分类,调用load方法,先加载父类,再加载子类,然后是分类 例如:

1  +(void)load
2  {
3      NSLog(@"Person---load");
4  }

3)initialize方法 当第一次使用类的时候,调用initialize方法,先调用父类的,再调用子类的 例如:

1 +(void)initialize
2  {
3     NSLog(@"Person---initialize");
4  }

iOS开发——语法篇OC篇&高级语法精讲的更多相关文章

  1. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  2. ios开发——实用技术篇OC篇&iOS的主要框架

    iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...

  3. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  4. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  5. iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

    使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...

  6. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  7. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

  8. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

  9. iOS开发——网络编程OC篇&使用WebView构建HyBird应用

    使用WebView构建HyBird应用 HyBird是一种本地技术与Web相结合,能过实现跨平台的移动应用开发,最常用的一个框架:PhoneGap 一:首先,写好html代码 <!DOCTYPE ...

  10. iOS开发——图形编程OC篇&粘性动画以及果冻效果

    粘性动画以及果冻效果 在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲 ...

随机推荐

  1. C# chart控件绘制曲线

    在.NET中以前经常用GDI去绘制,虽然效果也不错,自从.NET 4.0开始,专门为绘制图表而生的Chart控件出现了,有了它,就可以轻松的绘制你所需要的曲线图.柱状图什么的了. using Syst ...

  2. 使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法

    使用HttpURLConnection下载文件时经常会出现 java.io.FileNotFoundException文件找不到异常,下面介绍下解决办法 首先设置tomcat对get数据的编码:con ...

  3. webdriver(python)学习笔记七——多层框架定位与智能等待

    多层框架或窗口定位: switch_to_frame() switch_to_window() 智能等待: implicitly_wait() 现在web应用中经常会遇到框架如(frame)或窗口(w ...

  4. XShell 屏幕锁定的恢复方法(Ctrl+Q)

    操作XShell过程中很多时间大家会习惯性的按Ctrl+S进行保存. Ctrl+S在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭. 解决方法: 快捷键 Ctrl+Q 即能完成解锁 ...

  5. 复制表的sql语句

    1.sqlserver 原表存在:insert into a select * from b 原表不存在:select * into a from b 2.mysql.oracle 原表存在:inse ...

  6. 状压DP uvalive 6560

    // 状压DP uvalive 6560 // 题意:相邻格子之间可以合并,合并后的格子的值是之前两个格子的乘积,没有合并的为0,求最大价值 // 思路: // dp[i][j]:第i行j状态下的值 ...

  7. Hadoop在百度的应用

    百度作为全球最大的中文搜索引擎公司,提供基于搜索引擎的各种产品,包括以网络搜索为主的功能性搜索:以贴吧为主的社区搜索:针对区域.行业的垂直搜索.MP3音乐搜索,以及百科等,几乎覆盖了中文网络世界中所有 ...

  8. 【恒天云技术分享系列10】OpenStack块存储技术

    原文:http://www.hengtianyun.com/download-show-id-101.html 块存储,简单来说就是提供了块设备存储的接口.用户需要把块存储卷附加到虚拟机(或者裸机)上 ...

  9. pyinstaller使用小结

    安装pyinstaller pip install -U pyinstaller 生成控制台程序 pyinstaller ./example.py 在当前目录的dist文件夹内可以找到编译成功的程序 ...

  10. Entity Framework Power Tools

    http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d