1.字符串

OC由两个字符串:NSString和NSMutableString,NSString代表字符序列不可变的字符串,而NSMutableString则代表字符序列可变的字符串。

1.1 创建字符串

unichar data[6]={97,98,99,100,101,102};
//使用Unicode数组初始化字符串
NSString* str = [[NSString alloc] initWithCharacters:data length:6];
NSLog(@"%@",str);
//将C风格的字符串转换为NSString对象
char * cstr = "Hello,iOS";
NSString * str2 = [NSString stringWithUTF8String:cstr];
NSLog(@"%@",str2);
//将字符串写入指定文件
[str2 writeToFile:@"myFile.txt"
atomically:YES
encoding:NSUTF8StringEncoding
error:nil];
//读取文件内容,用文件内容初始化字符串
NSString* str3 = [NSString stringWithContentsOfFile:@"myFile.txt"
encoding:NSUTF8StringEncoding
error:nil];
NSLog(@"%@",str3);

1.2 NSString的常用功能

		NSString* str = @"Hello";
NSString* book =@"速度与激情";
//获取字符串对应的C风格字符串
const char* cstr = [str UTF8String];
NSLog(@"获取的C字符串%s",cstr); str = [str stringByAppendingFormat:@"%@是一部不错的电影.",book];
NSLog(@"%@",str);
NSLog(@"%lu",[str length]);
NSLog(@"str按UTF8字符集解码后字节数:%lu",[
str lengthOfBytesUsingEncoding:NSUTF8StringEncoding
]);
//获取str的前10个字符租场的字符串
NSString* s1 =[str substringToIndex:10];
NSLog(@"%@",s1);
NSString* s2 = [str substringFromIndex:5];
NSLog(@"%@",s2);
NSString * s3 = [str substringWithRange:NSMakeRange(5,10)];
NSLog(@"%@",s3);
NSRange pos = [str rangeOfString:@"电影"];
NSLog(@"电影在str中出现的开始位置:%ld,长度为:%ld",pos.location,pos.length);
str = [str uppercaseString];
NSLog(@"%@",str);

2.日期与实践

2.1日期与实践(NSDate)

NSDate对象代表日期与实践,OC提供了类方法来创建NSDate对象,也提供了init开头的方法来初始化NSDate。

		//获取代表当前日期、时间的NSDate
NSDate* date1 = [NSDate date];
//创建从当前时间开始,一天之后的日期
NSDate* date2=[[NSDate alloc] initWithTimeIntervalSinceNow:3600*24];
//创建3天之前的日期
NSDate* date3 =[[NSDate alloc] initWithTimeIntervalSinceNow:-3*3600*24];
//获取1970年20年之后的日期
NSDate* date4 =[NSDate dateWithTimeIntervalSince1970:3600*24*366*20];
//获取系统当前的Locacle
NSLocale* cn = [NSLocale currentLocale];
//获取NSDate在当前Locale对应的字符串
NSLog(@"%@",[date1 descriptionWithLocale:cn]);
NSDate* earlier =[date1 earlierDate:date2];
NSDate * later = [date2 laterDate:date2]; switch([date1 compare:date3])
{
case NSOrderedSame:
NSLog(@"date1位于date3之前");
break;
case NSOrderedAscending:
NSLog(@"date1位于date3之前");
break;
case NSOrderedDescending:
NSLog(@"date1位于date3之前");
break;
}
NSLog(@"date1与date3之间差%g秒",[date1 timeIntervalSinceDate:date3]);
NSLog(@"date2与现在的时间差%g秒",[date2 timeIntervalSinceNow]);

2.2 日期格式化(NSDateFormatter)

NSDateFormatter代表一个日期格式器,用于NSDate和NSString之间的转换

调用NSDateFormatter的setDateStyle:、setTimeStyle方法设置格式化日期时间的风格,支持如下几个枚举值:

  • NSDateFormatterNoStyle
  • NSDateFormatterShortStyle
  • NSDateFormatterMediumStyle
  • NSDateFormMatterLongStyle
  • NSDateFormmatterFullStyle
		NSDate* dt =[[NSDate alloc] init];
NSDateFormatter* df2 = [[NSDateFormatter alloc] init];
[df2 setDateFormat:@"yyyy-MM-dd HH:mm"];
NSLog(@"%@",[df2 stringFromDate:dt]);
NSString* dateStr=@"2013-03-02";
NSDateFormatter* df3 = [[NSDateFormatter alloc] init];
[df3 setDateFormat:@"yyyy-MM-dd"];
NSDate* date2 = [df3 dateFromString:dateStr];
NSLog(@"%@",date2); NSLocale* locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterShortStyle];
[df setLocale:locale];
NSLog(@"%@",[df stringFromDate:dt]);

2.3 日历(NSCalendar)和日期组件(NSDateComponents)

为了能分开处理NSDate对象所包含的各个字段的数据,Foundation框架提供了NSCalendar,两个常用的方法:

  • (NSDateComponents*)components:fromDate: 从NSDate提取年、月、日、时分秒
  • dateFromComponents:(NSDateComponents*) comps

NSDateComponents用于封装各个时间段的信息,包含了year/month/date/day/hour/minute/senond/week/weekday 等各个字段的setter getter方法

2.4 定时器(NSTimer)

3.NSCopying与NSMutableCopy协议

4.数组(NSArray与NSMutableArray)

NSArray代表元素有序、可重复的一个集合,每个元素都有对应的索引。

4.1 NSArray的功能与用法

NSArray提供了类方法和实例方法来创建NSArray,类方法以array开始,实例方法以init开头。

  • array 创建一个不包含任何元素的空NSArray
  • arrayWithContentsOfFile:/initWithContentsOfFile: 读取文件来创建NSArray
  • arrayWithObject:/initWithObject: 创建只包含指定元素的NSArray
  • arrayWithObjects:/initWithObjects: 创建包含指定的N个元素的NSarray

NSArray中大量需要判断指定元素位于NSArray集合中的索引,只要某个集合元素与被查找元素通过isEqual:方法比较返回YES,即可认为该NSArray集合包含该元素,并不需要两个元素是同一个元素。

//重写isEqual:方法
-(BOOL) isEqual:(id)other
{
if(self == other)
{
return YES;
}
else([other class] == self.class);
{
FKUser* target = (FKUser*)other;
return [self.name isEqualToString:target.name]
&& [self.pass isEqualToString:target.pass];
}
return NO;
}

4.2对集合元素整体调用方法

如果只是简单调用集合元素的方法,可以通过NSArray的如下两种方法

  • makeObjectsPerformSelector: 依次调用NSArray集合中每个元素的指定方法,该方法需要传入一个SEL参数,用于指定调用那种方法。
  • makeObjectsPerformSelector:withObject: 第二个参数用于调用集合元素的方法是传入参数,第三个参数用于控制是否终止迭代。

如果希望对集合中的所有元素进行隐式遍历,并使用集合元素来执行某一段代码,可用NSArray如下方法:

  • enumerateObjectsUsingBlock 遍历集合中的所有元素,并一次使用元素来执行指定的代码块
  • enumerateObjectsWithOptions:usingBlock: 遍历集合中的所有元素,并一次使用元素来执行指定的代码块。该方法可以额外传入一个参数,用于控制遍历 的选项
  • enumerateObjectsAtIndexes:options:usingBlcok: 遍历集合中指定范围内的元素,并一次使用元素来执行指定的代码块。可传入一个选项参数
//对集合元素整体调用方法
[array makeObjectsPerformSelector:@selector(say:) withObject:@"下午好,NSArray"]; NSString* content = @"Hello,iOS";
[array enumerateObjectsAtIndexes:
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2,2)]
options:NSEnumerationReverse
//代码块第一个参数表示正在遍历的集合元素,第二个参数表示正在遍历的集合元素的索引
usingBlock:^(id obj,NSUInteger idx,BOOL *stop)
{
NSLog(@"正在处理第%ld个元素:%@",idx,obj);
[obj say:content];
}];

4.3 NSArray 排序

NSArray提供了大量的方法对集合进行排序,以sort 开头,常用的如下:

  • sortedArrayUsingFunction:context: 使用排序函数对集合元素进行排序,函数返回 NSOrderedDescending/NSOrderedAscending/NSOrderedSame 枚举值
  • sortedArrayUsingSelector: 使用集合元素自身的方法对集合进行排序
  • sortedArrayUsingComparator: 使用代码块对函数进行排序,

4.4 使用枚举器遍历NSArray集合元素

调用NSArray的如下两个方法来返回枚举器:

  • objectEnumerator: 返回NSArray集合的顺序枚举器

  • reverseObjectEnumerator: 返回NSArray集合的逆序枚举器

    返回一个NSEnumerator枚举器,包含如下2个方法:

  • allObjects: 获取被枚举集合中的所有元素

  • nextObject 获取被枚举集合的下一个元素

4.5 快速枚举(for...in)

快速枚举的语法:

for(type variableName in collection)
{
//variableName自动迭代每个元素
}

4.6 可变数组(NSMutableArray)

NSArray代表集合元素不可变的集合。NSMutableArray是NSArray的子类,代表集合元素可变的集合,可以添加、删除、替换集合元素。

NSMutableArray新增了如下方法。

  • 添加集合元素的方法,以add开头
  • 删除集合元素的方法,以remove开头
  • 替换集合元素的方法,以replace开头
  • 对集合本身排序的方法,以sort开头

4.7 NSArray的KVC、KVO

NSArray允许直接对集合中的所有元素进行整体的KVC编码:

  • setValue: forKey: 将集合中所有元素的制定key对应属性或实例变量设置为value
  • valueForKey:返回该集合中所有元素的指定key组成的NSArray对象。

NSArray为所有元素或部分元素进行KVO编程提供了如下方法:

  • addObserver: forKeyPath: options: context: 为集合中所有元素添加KVO监听器
  • removeObserver:forKeyPath: 为集合中所有元素删除KVO监听器
  • removeObserver:fromObjectsAtIndexes:forKeyPath: 为集合中指定索引出的元素删除KVO监听器

5.集合(NSSet/NSMutableSet)

NSSet集合不允许包含相同的元素,如果试图把2个相同的元素放在同一个NSSet里,则只会保留同一个元素。

5.1 NSSet的功能与用法

NSSet包含如下常用方法:

  • setByAddingObject: 向集合添加一个新元素,返回添加元素后的新集合
  • setByAddingObjectsFromSet: 使用NSSet集合想集合中添加多个新元素
  • setByAddingObjectsFromArray:使用NSArray集合向集合中添加多个新元素
  • allObjects: 返回集合中所有元素组成的NSArray
  • anyObject: 返回该集合中的某个元素
  • containsObject 判断集合是否包含指定元素
  • member 判断该集合是否包含与参数相等的元素,
  • objectsPassingTest 需要传入一个代码块对集合进行过滤
  • objectsWithOptions:passingTest
  • isSubSetOfSet:判断当前NSSet集合是否为另一个集合的子集合
  • intersectsSet 判断两个集合的元素是否有相同的元素,是否存在交集
  • isEqualToSet 判断两个集合的元素是否相等

5.2 NSSet判断集合元素重复

  1. 两个对象通过isEqual:方法比较返回YES
  2. 两个对象的hash方法返回值也相等

5.3 NSMutableSet

NSMutableSet继承NSSet,代表一个集合元素可变的NSSet集合,创建是可以指定底层Hash表的初始容量。

NSMutableSet增加了添加、删除元素的方法,增加了对集合计算交集、并集、差集的方法

  • addObject: 添加单个元素
  • removeObject: 删除单个元素
  • removeAllObject:删除所有元素
  • addObjectsFromArray:
  • unionSet: 计算两个NSSet集合的并集
  • minusSet: 差集
  • intersectSet: 交集
  • setSet: 用后一个集合的元素替换已有集合中的所有元素

5.4 NSCountedSet

NSCountedSet是NSMutableSet的子类,为每个元素维护一个添加次数的状态。添加集合以存在的元素,添加次数加1.删除一个元素时,删除一次添加次数减1,当添加次数变位0,才会真正从集合删除。

countForObject: 获取指定元素的添加次数。

6.有序集合(NSOrderedSet/NSMutableOrderedSet)

NSOrderedSet不允许重复,可以保持元素的添加顺序,每个元素都有索引,可以根据索引来操作元素。

7.字典(NSDictionary与NSMutableDictionary)

NSDictionary用于保存具有映射关系的数据,NSDictionary集合保存着两组值,一组保存Key,一组保存value,key不允许重复。

7.1 功能与用法

NSDictionary提供了类方法(以dictionary开始)和实例方法(以init开头)来创建NSDictionary。

  • dictionary: 创建一个不包含任何key-value的NSDictionary
  • dictionaryWithContentsOfFile:/initWithContentsOFFile: 读取指定文件的内容来初始化NSDictionary,该文件通常是由NSDictionary自己输出生成的。
  • dictionaryWithDictionary:/initWithDictionary 使用已有的NSDictionary包含的key-value对来初始化
  • dictionaryWithObject:forKey:使用单个key-value来创建NSDictionary
  • dictionaryWithObjects:forKeys:/initWithObjects:forKey:使用2个NSArray分别指定key、value 集合
  • dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys: 调用该方法是,需要按value1,key1,value2,key2,...nil格式传入多个key-value对
常用方法
  • count
  • allKeys 返回所有的key
  • allKeysForObject: 返回指定value对应的全部key
  • allValues: 返回所有的value
  • objectForKey: 返回指定key对应的value
  • objectForKeyedSubscript: 通过该方法的支持,允许NSDictionary通过下表来获取指定key对应的value。
  • valueForKey: 获取指定key对应的value
  • keyEnumerator: 集合所有key的NSEnumerator对象
  • objectEnumerator: 集合所有value的NSEnumerator对象
  • enumerateKeysAndObjectsUsingBlock: 使用指定的代码块来迭代执行该集合中所有的key-value对
  • enumerateKeysAndObjectsWithOptions:usingBlock: 使用代码块来迭代key-value,可传入一个额外的NSEnumeratorOptions参数
  • writeToFile:atomically: 将集合写入文件
key排序

NSDictionary提供的排序方法如下:

  • keysSortedByValueUsingSelector:
  • keysSortedByValueUsingComparator:
  • keysSortedByValueWithOptions:usingComparator:
key过滤
  • keysOfEntriesPassingTest: 使用代码块迭代处理NSDictionary的key-value
NSSet* keySet = [dict keysOfEntriesPassingTest:
^(id key,id value,BOOL* stop){
//return
}];
  • keysOfEntriesWithOptions:passingTest:

7.2 NSMutableDictionary

NSMutableDictionary继承了NSDictionary,代表了一个key-value可变的NSDictionary.

新增的方法:

  • setObject:forKey: 新增一个key-value对。如果key存在,则覆盖
  • setObject:forKeyedSubscript: 通过该方法的支持,允许程序通过下标法来设置key-value
  • addEntriesFromDictionary:将另一个NSDictionary所有的key-value复制到当前NSDictionary中
  • setDictionary: 用另一个Dictionary替换掉当前Dictionary
  • removeObjectForKey: 根据key来删除key-value
  • removeAllObjects: 清空Dictionary
  • removeObjectsForKeys: 多个key 组成的NSArray,同时 删除多个key-value

8 谓词

NSPredicate用于定义一个逻辑条件,通过该条件可执行搜索或内存中的过滤操作。

8.1 定义谓词

谓词由NSPredicate对象来代表,由三个子类 NSComparisonPredicate,NSCompoundPredicate,NSExpression,通常直接使用NSPredicate的 predicateWithFormat:方法,以谓词字符串为参数来创建NSPredicate对象

创建谓词后,如果谓词中没有占位符,可以使用NSPredicate的evaluteWithObject:方法计算谓词的结果,返回BOOL;如果谓词由占位符,需要经过两步:

  1. 调用谓词的 predicateWithSubstiutionVariables:方法为占位符参数设置参数值
  2. 执行谓词的evaluateWithObject:方法计算谓词的返回结果

可以使用evaluateWithObject:substitutionVariables:方法,同时执行上面两步

		NSPredicate* pred = [NSPredicate predicateWithFormat:@"name like 's*'"];
FKUser* user1 = [[FKUser alloc] initWithName:@"sun" pass:@"555" ];
BOOL b = [pred evaluateWithObject:user1];

8.2使用谓词过滤集合

谓词本身代表一个逻辑条件,计算谓词的结果就是返回BOOL类型的值。谓词对集合进行过滤,程序将会自动遍历集合元素,根据集合元素来计算谓词的值。

NSArray提供了如下方法使用谓词

  • (NSArray*) filteredArrayUsingPredicate:(NSPredicate*)predicate:

NSMutableArray提供了如下方法使用谓词过滤集合:

  • -(void)filterUsingPredicate:(NSPredicate*)predicate:

NSSet提供了如下方法:

  • -(NSSet*) filteredSetUsingPredicate:(NSPredicate*) predicate:

NSMutableSet:

  • -(void) filterUsingPredicate:(NSPredicate*) predicate:

8.3使用占位符

谓词表达式支持两个占位符参数:

  1. %K 用于动态传入属性名
  2. %@ 用户动态设置属性值

示例片段

		NSString * propPath = @"name";
NSString* value =@"x";
//创建谓词,包含两个占位符
NSPredicate* pred = [NSPredicate predicateWithFormat:
@"%K contains %@",propPath,value];
NSSet* newset = [set filteredSetUsingPredicate:pred];
NSLog(@"%@",newset); NSPredicate * preTemplate = [NSPredicate predicateWithFormat:
@"%K CONTAINS $SUBSTR",@"pass"]; NSPredicate* pred1 = [preTemplate
predicateWithSubstitutionVariables:
[NSDictionary dictionaryWithObjectsAndKeys:@"aa",@"SUBSTR",nil]
];
NSSet* newset1 = [set filteredSetUsingPredicate:pred1];
NSLog(@"%@",newset1);
谓词的表达式语法:
  • 基本比较运算符

    • =、==
    • <= =>
    • <= =<
    • <
    • <
    • != 、==
    • BETWEEN “express between {下限,上限}”
  • 基本逻辑运算符
    • AND &&
    • OR ||
    • NOT !:
  • 字符串比较
    • BEGINSWITH
    • ENDSWITH
    • CONTAINS
    • LIKE 可以使用*(任意多个字符)和?(一个字符)通配符 ,
    • MATCHES
  • 操作集合
    • ANY SOME 有一个元素满足条件返回YES
    • ALL 全部满足条件返回YES
    • NONE 全部不满足返回YES
    • IN name in {'a','b','c'}
    • array[index] 索引出的元素
    • array[FIRST] 第一个元素
    • array[LAST] 返回数组最后一个元素
    • array[SIZE] 返回数组的个数
  • 直接量
    • FALSE/NO
    • TRUE/YES
    • NULL/NIL
    • SELF
    • 字符串 'text'
    • 数组 {'a','b','c'}
    • 数值
    • 十六进制 0x开头
    • 八进制 0o
    • 二进制 0b
  • 保留字

Objective-C Foundation框架的更多相关文章

  1. Objective - c Foundation 框架详解2

    Objective - c  Foundation 框架详解2 Collection Agency Cocoa provides a number of collection classes such ...

  2. Objective-C( Foundation框架 一 常见的结构体)

    常见的结构体 (NSPoint,CGPoint).(NSRange,CGRange).(NSSize,CGSize) 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的 ...

  3. Objective-C语言Foundation框架

    Mac OS X开发会使用Cocoa框架,它是一种支持应用程序提供丰富用户体验的框架,它实际上由:Foundation和Application Kit(AppKit)框架组成.iOS开发,会使用Coc ...

  4. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  5. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  6. Foundation框架-NSString和NSMutableString

    可变与不可变的字符串 --1-- Foundation框架介绍 1.1 框架介绍 --2-- NSString 2.1 NSString介绍及使用 2.2 NSString创建方式  2.3 从文件中 ...

  7. Core Foundation框架

    转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...

  8. 08OC之Foundation框架

    1.Foundation框架简述 在前面,我们创建一个类的时候,都会选择Cocoa Class.到底Cocoa Class是什么东西呢? Cocoa 不是一门编程语言,因为它可以运行在多种编程语言上, ...

  9. foundation框架—结构体

    Foundation框架—结构体 一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...

  10. Foundation框架—字符串

    Foundation框架—字符串 一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:O ...

随机推荐

  1. 5.21_启程日本二面_1 vs 1

    昨天上午刚群面完,晚上7点左右就接到了电话.面试官就两位菇凉,看来她们也是很辛苦.今天下午3点 1 vs 1,在一家咖啡店里,主要是询问下去日本的意愿是否足够强烈.太老实,这里实话实说,也没有表现出非 ...

  2. A-Frame_简单介绍

    VR框架A-Frame: https://aframe.io 版本: 0.2.0    30/6/2016 A-Frame 是一个能够实现在web网页上实现3D和VR体验的开源框架,它是由 MozVR ...

  3. source insight用于C语言编程的工具脚本

    简单来说,source insight提供的功能功能还不够傻瓜,用起来还不够方便,所以写了此脚本,提高开发效率. 部分source insight提供的功能也包含了进来,主要是因为我不喜欢使用太多的快 ...

  4. 关于PYTHON_EGG_CACHE无权限的问题

    Perhaps your account does not have write access to this directory? You can change the cache director ...

  5. Entity Framework 5问题集锦

    ORM框架万万千,一直都使用NHibernate,没用过其他的.最近闲来学习下微软自家的Entity Framework,记录一些我学习过程中遇到的头疼问题.(不断更新中...) 教程:http:// ...

  6. 利用JS实现的根据经纬度计算地球上两点之间的距离

      最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距 ...

  7. 11)Java abstract class 和 interface

    abstract class 和 interface 的区别        含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象.含有abstract方法的类必须定义 ...

  8. eclipse使用快捷键

    注意热键冲突 内容补全键      Alt+/ 快速修复键      ctrl+1 代码移动         Alt+上下键(选中代码块) 左右移动         tab(右边)Shift+tab( ...

  9. 压力测试之TCPP

    1.下载源码 tpcc-mysql-src.tgz 2.解压 tpcc-mysql-src.tgz 3.安装 [root@DBMysql mysql]# cd /home/mysql/tpcc-mys ...

  10. Oracle 11g 执行计划管理1

    1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...