iOS开发——语法篇OC篇&高级语法精讲

时间:2021-08-29 09:36:40

高级语法精讲

一、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篇&amp&semi;网络爬虫-使用青花瓷抓取网络数据

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

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

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

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

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

  4. iOS开发——UI精选OC篇&amp&semi;UIApplication&comma;UIWindow&comma;UIViewController&comma;UIView&lpar;layer&rpar;简单介绍

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

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

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

  6. iOS开发——新特性OC篇&amp&semi;Swift 2&period;0新特性

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

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

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

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

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

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

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

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

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

随机推荐

  1. AEAI Portal V3&period;5&period;4升级说明,门户集成平台

    1 总体说明 本次升级是AEAI Portal的一次重要升级,主要扩展了开发社区(论坛).移动门户功能,同时修正一些功能BUG等,具体内容如下: 2 升级内容 功能扩展: 扩展开发社区导航 扩展移动门 ...

  2. javamail 发送附件

    1.属性文件 mail.protocol=smtpmail.host=mail.port=mail.auth=truemail.timeout=25000mail.username=mail.pass ...

  3. js实现把网页table导成Excel

    //导出excel function exportExcel(DivID,strTitle){ if(DivID==null) { return false; } var jXls, myWorkbo ...

  4. about control &percnt;CPU

    #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define timesize 200000 ...

  5. Java:多线程之生产者与消费者

    要求:用两个线程模拟存票.售票过程.但要求每存入一张票,就售出一张票,售出后,再存入,直到售完为止. 用到的知识点:线程等待.唤醒.可能的线程中断异常 下面的方式一和方式二采用的是唤醒所有等待的线程, ...

  6. Learning WCF Chapter2 WCF Contracts and Serialization

    So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the dev ...

  7. Oracle Net Listener Parameters &lpar;listener&period;ora&rpar;(转)

    12/20 7 Oracle Net Listener Parameters (listener.ora) This chapter provides a complete listing of th ...

  8. nginx实现新老网站跳转(原URL不变)

    新老网站实现跳转 原URL保持不变 通过手动添加cookie 匹配cookie的方法进行跳转第一步 进行添加if判断条件 if ( $query_string ~* "sr=pro&quot ...

  9. C语言之四舍五入

    在C语言中,如果进行强制类型转换,它会将所需要取的位数直接提取出来,而其他位数的数字会被直接删除,不会对提取出来的位数有任何影响 所以如果我们需要提高精度,对所取的数进行四舍五入,需要给所需去的数的最 ...

  10. Fair Candy Swap LT888

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...