文件加载与保存
cocoa中存在一种名为属性列表
(property list)的对象,简写plist
,这些列表可以放置一些cocoa可以处理的对象,这些属性列表类似NSArray, NSDictionary, NSString, NSNumber, NSDate, NSData
以及它们的可修改形态(Mutable)
集合型属性列表类(NSArray和NSDictionary)具有一个writeToFile:atomically:
方法将内容写入文件,atomically
传递一个BOOL值表明是否需要将内容存到老师文件中,这能保证在保存过程中发生意外是不会破坏原始文件
NSPropertyListSerialization
对于自定义对象且不是属性列表类型时,可以通过NSCoding
协议和实现方法来编码和解码对象
键/值编码(KVC)
KVC的基本调用
-valueForkey:
-setValue:forKey:
//例如
NSString *name = [obj valueForKey:@"name"];
// 可以通过此方法获取obj对象的name属性
// 对于int,float,struct最终setValueForKey会自动装箱放入NSNumber或NSValue中,之后调用的set属性:中会先开箱取出该值
// 键路径,假设一个对象car内存在另一个对象属性数组tires且tire中存在一个属性pressure则
[car valueForKeyPath:@"tires.pressure"];
// 将打印car对象中tires数组中每个对应tire对象的pressure,但不支持tires[0].pressure这种索引访问
在键路径中不仅能引用对象值还可以引用一些运算符来进行运算
// 计算tires的个数, @count
[car valueForKeyPath:@"tires.@count"];
// 计算tires中pressure的平均值, @avg
[car valueForKeyPath:@"tires.@avg.pressure"];
// 类似的还有@min和@max用法与@avg相同
kvc提供了一些便利的同事存在某些缺点
- KVC需要解析字符串来计算你所需的答案,因此速度比较慢
- 同事处理tires.@avg.pressure时编译器不能判断它是否为错误的键路径,可能会出现运行时错误
dictionaryWithValuesForKeys:
// 接收一个字符串数组,对其中的每个值调用valueForKey:方法
在使用setValue:forKey:时若value传递的是nil会出现一个异常
此时可以使用setNilValueForKey:
// 区分<null>和(null), 前者是[NSNull null]对象,后者是最终的nil值
xcode静态分析器,product => Analyze
NSPredicate
NSPredicate
用于指定过滤器条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'ab'"];
//除去'ab'字符串常量还可以使用$NAME 这种名为键为NAME的值,也可以配合使用格式扫码付%
[NSPredicate predicateWithFormat:@"%K == '%@'", @"name", @"ab"];// %K用来指定键路径
SELF表式响应谓词计算的对象,针对字符串还有BEGINSWITCH,ENDSWITH,CONTAINS
LIKE用于匹配运算