命名规则:
必须以字母或下划线(_)开头,之后可以是任何(大写或小写)字母、下划线或者0~9之间的数字组合。
Objective-C中的大小写是有区别的。
类名,通常以大写字母开头。
实例变量、对象以及方法的名称,通常以小写字母开头。
而名称中的新单词应以大写字母开头。
@interface部分
@interface NewClassName : ParentClassName
propertyAndMethodDeclarations;
@end
类方法,是对类本身执行某些操作的方法,例如创建类的新实例。
实例方法,能都对类的实例执行一些操作。
声明一个方法:
-/+ returnType methodName : (parameterType) parameter
方法类型 返回类型 方法名称 :(方法有参数) 参数类型 参数名称
@implementation部分
@implementation NewClassName
{
memberDeclarations;
}
methodDefinitions;
@end
类或实例应用方法:
[ ClassOrInstance method ];
类型 | 实例 | NSLog字符 |
char | ‘a’、’\n’ | %c |
Short int |
| %hi、%hx、%ho |
unsigned short int |
| %hi、%hx、%ho |
int | 12、-97、0xFFE0、0177 | %i、%x、%o |
unsigned int | 12u、100U、0XFFu | %u、%x、%o |
long int | 12L、-200L、0xffffL | %li、%lx、%lo |
unsigned long int | 12UL、100ul、0xffeeUL | %lu、%lx、%lo |
long long int | 0xe5e5e5e5LL。500ll | %lli、%llx、%llo |
unsigned long long int | 12ull、0xffeeULL | %llu、%llx、%llo |
float | 12.34f、3.1e-5f、0x1.5p10 | %f、%e、%g、%a |
double | 12.34、3.1e-5、0x.1p3 | %f、%e、%g、%a |
long double | 12.34L、3.1e-5l | %Lf、%Le、%Lg |
id | nil | %p |
除逗号运算符外的所有运算符都比赋值运算符的优先级高,而所有的赋值运算符的优先级相同。故:
a /= b + c 相当于 a = a / (b +c)
与任何算术运算符或关系运算符相比,&&运算符有更低的优先级,但他比||运算符的优先级要高。
闰年:能被4整除但不能被100整除,或能被400整除。
Boolean类型:
C语言拥有布尔数据类型bool,它具有true和false值。
Objective-C提供了相似的类型BOOL,它具有YES(1)和NO(0)值。
注:Objective-C并不将BOOL作为仅能保存YES和NO值的真正的布尔类型来处理。编译器将BOOL认做8位二进制数,YES和NO只是一种约定。所以如果不小心将一个长于1字节的整数值(例如short或int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。假设该低位字节刚好为0(例如8960,写出十六进制为0x2300),BOOL值将会是0,即NO值。
条件运算符是从右到左结合的,这意味着在单个表达式中可以使用多个运算符,因此语句e1 ? e2 : e3 ? e4 : e5
相当于
e1 ? e2 :(e3 ? e4 : e5)
实现部分(@implementation部分)包含的是私有信息,即实例变量和代码。
@property指令标志属性。
@synthesize property =instanceVar;
属性的命名与实例变量相同,尽管不是必须要这么做。当属性名与实例变量名不同时,访问属性应用以下语法
self.property = value;
或
[instanceVar setProperty];
以使编译器知道我们期望使用访问器访问property,否则编译器将假设我们直接修改了实例变量,因为在这种情况调用@synthesize指令后编译器仍将创建-setProperty:和-property方法,但实现中却使用实例变量instanceVar。
如果使用了@property指令,就不需要在实现部分声明相应的实例变量。
《Objective-C基础教程》(p172)
关于属性、存取方法和实例变量:《Objective-C程序设计(第四版)》(p202)
根类:没有父类的类,位于类层次结构的最顶层。
超类 / 父类
子类
要在子类中直接使用(父类的)实例变量,必须现在接口部分声明。在实现部分声明和合成(@synthesize)的实例变量是私有的,子类并不能够直接访问,需要明确通过定义的或合成的取值方法,才能访问实例变量的值。
@class指令
使用@class指令提高了效率,因为编译器不需要引用和处理整个ClassName.h文件,只需要知道ClassName是一个类名。如果需要引用ClassName类的方法(在实现部分中),@class指令是不够的,因为编译器需要更多的消息。它需要清楚方法有多少参数,它们是什么类型、方法的返回类型是什么。
多态:使不同的类共享相同方法名称的能力称为多态。
Id数据类型,是一种通用的对象类型。也就是说,id可以用来存储属于任何类的对象。
存储在id变量中的对象类型在编译时无法确定,所以一些测试推迟到运行时进行。也就是说,推迟到程序执行时。
静态类型,“静态”指的是对存储在变量中对象的类型进行显式声明,这样,存储在这种形态中的对象的类时预定义的,也就是静态的。
关心静态类型时因为它能更好地在程序编译阶段而不是在运行时指出错误。另一个原因是它能够提高程序的可读性。
要根据类名或另一个对象生成一个类对象,可以向它发送class消息。
[ ClassOrInstance class ];
selector是SEL类型,可以对一个方法名应用@selector指令生成。
覆写init方法的标准“模板”:
-(id) init
{
self= [ super init ];
If( self ) {
//初始化代码
}
}
在接口部分声明实例变量时,可以通过一下指令精确地控制其作用域(《Objective-C程序设计(第四版)》(p201))
@protected、@private、@public、@package
enum类型:
enum typeName { valuseList}
枚举标识符对应着一个整数值,默认0开始递增。
枚举标识符可以共享相同的值,比如
enum boolean { no = 0, false = 0, yes = 1, true = 1 };
Objective-C编译器实际上将枚举标识符作为整型常量来处理。如
enum month { january =1, february, march, april, may, june, july,august, september, october, november, december };
enum month thisMonth;
thisMonth = february;
那么给thisMonth赋的值是整数2(而不是february这个名字)。
type语句:
定义步骤:
(1) 像声明所需类型的变量那样编写一条语句。
(2) 在通常应该出现声明的变量名的地方,将其替换为新的类型名。
(3) 在语句的前面加上关键字typedef。
例子:定义一个名为Direction的枚举数据类型,它包含4个方向:东、南、西、北。
typedef enum { east, west, south, north} Direction;
Direction step1, step2;
移位运算符
左移:
超出数据项的高位的位将丢失,而从低位移入的值总为0。
右移:
1. 无符号的值向右移位总是左侧移入0。
2. 有符号,左侧移入1还是0取决于被移动数字的符号,还取决于该操作在计算机的实现方式。正值都将移入0。负值时或移入1(算术右移),或移入0(逻辑右移)。
命名的分类:(不能包含实例变量)
@interface ClassName (分类名) // 接口部分
// 类别方法声明
@end
@implement ClassName (分类名) // 实现部分
// 类别方法的定义
@end
将类的定义模块化到相关方法的组或分类中。它提供了扩展现有类定义的简便方式。
在使用一个对象时,对象的方法是在接口中声明、在父类中声明还是在类别中声明并不重要。
未命名的分类(类的扩展):
能包含实例变量。
未命名分类中声明的方法需要在主实现区域实现,而不是分离的实现区域中实现。
@protocol指令 (协议)
@protocol protocolName
// 方法列表
@optional
// 可选方法列表
@end
协议是多个类共享的一个方法列表。
协议中列出的方法没有相应的实现,计划由其他人来实现。
协议列出了一组方法,有些可以是选择实现,有些是必须实现。
通过在@interface行的一对尖括号(<···>)内列出协议名称,可以告知编译器你正在采用一个协议。这项协议的名称放在类名和它的父类名称之后。如
@interface AddressBook :NSObject <NSCopying>
@interface AddressBook :NSObject <NSCopying , NSCoding>
协议不引用任何类,它是无类的。
定义一项协议时,可以扩展现有的协议如
@protocol Drawing3D<Drawing >
分类也可以采用一项协议,语句如下
@interface ClassName (分类名) protocolName
非正式协议/抽象协议
它实际上是一个分类,列出了一组方法但并没有实现它们。(一般的分类,有声明有定义)
和正式协议不同,编译器不提供有关非正式协议的帮助。
而@optional指令的出现取代了非正式协议的使用。
#define
预定义名称一出现,预处理程序就执行文本替换,这可以解释为什么通常不能使用分号结束#define语句的原因。
#define IS_LEAP_YEAR(y) y%4 == 0 && y%100 != 0 || y%400 == 0
#define SQUARE(x) ( (x) * (x) )
NSNumber的创建方法和检索方法
创建和初始化方法 | 初始化实例方法 | 检索实例方法 |
numberWithChar | initWithChar | charValue |
numberWithUnsignedChar | initWithUnsignedChar | unsignedCharValue |
numberWithShort | initWithShort | shortValue |
numberWithUnsignedShort | initWithUnsignedShort | unsignedShortValue |
numberWithInteger | initWithInteger | integerValue |
numberWithUnsignInteger | initWithUnsignInteger | unsignIntegerValue |
numberWithInt | initWithInt | intValue |
numberWithUnsignedInt | initWithUnsignedInt | unsignedIntValue |
numberWithLong | initWithLong | longValue |
numberWithUnsignedLong | initWithUnsignedLong | unsignedLongValue |
numberWithLongLong | initWithLongLong | longlongValue |
numberWithUnsignLongLong | initWithUnsignedLongLong | unsignLongLongValue |
numberWithFloat | initWithFloat | floatValue |
numberWithDouble | initWithDouble | doubleValue |
numberWithBool | initWithBool | boolValue |
[intNumber isEqualToNumber:floatNumber]
使用了isEqualToNumber:方法比较两个NSNumber对象的数值。方法返回一个BOOL值。
[intNumber compare: myNumber]
中intNumber的值小于myNumber的值时,返回NSOrderedAscending;如果这两个数刚好相等,则返回NSOrderdSame;如果intNumber的值大于myNumber的值,则返回NSOrderedDescending.
其中NSOrderedAscending、NSOrderdSame和NSOrderedDescending都是NSComparisonResult类型的值。
应该注意,不能修改前面创建的NSNumber对象的值。例如
NSNumber *myNumber = [[NSNumber alloc] initWithInt : 50];
···
[myNumber initWithInt :1000];
所有的数字对象都必须时新创建的。
numberWithInt:和numberWithInteger:使用有些差别:
1. 如果使用numberWithInt:方法创建一个整型数,需要使用intValue获取它的值,使用%i作为格式化字符串显示它的值。
2. 如果使用numberWithInteger:方法创建一个整型数,需要使用integerValue,也可以转换成long显示或者使用stringWithFormat:将它格式化成字符串。使用%i作为格式化字符串。
description方法:
格式符%@可用于显示数组、字典和集合的全部内容。通过覆盖继承的description方法还可以使用这些格式字符显示类对象。
-(NSString *) description
{
return[NSString stringWithFormat: @”%i%i”,numerator, denominator];
}
+(NSString *) stringWithString : (NSString * str)
[NSString stringWithString :str1];
使用一个字符串str1的内容生成一个新字符串
+(id) stringWithFormat :(NSString *) format, …;
NSString *height;
height = [NSString stringWithFormat : @”Your hright is %d feet, %d inches”, 5, 11];
得到的字符串是“Your height is 5 feet, 11 inches”。
[str1 stringByAppendingString: str2];
创建一个新的字符串对象,这个对象由str1和str2的字符拼接而成,然后返回结果。
[str1 length];
计算字符串中的字符
正确比较字符串
比较两个字符串是否相等,应该用isEqualToString:,而不能仅仅只是比较字符串的指针值。
==运算符只判断操作数的指针数值,而不是它们所指的对象。利用这点可以判断两个指针是否指向同一对象。
不区分大小写的比较
compare:方法进行的是区分大小写的比较。
compare:options:方法能给我们更多的控制权。
options参数是一个位掩码,可以使用位码运算符(|)来添加选项标记。常用的选项如下
NSCaseInsensitiveSearch——不区分大小写字符
NSLiteralSearch——进行完全比较,区分大小写。
NSNumericSearch——比较字符串的字符个数,而不是字符值。如果没有这个选项,“100”会排在“99”的前面,这会让人觉得奇怪,甚至也可能是错误的排序。
-(BOOL) hasPrefix : (NSString*) aString;// 检查字符串是否以另一个字符串开头。
-(BOOL) hasSuffix : (NSString*) aString;// 检查字符串是否以另一个字符串结尾。
-(NSRange) rangeOfString :(NSString *) aString;// 检查字符串内的某处是否包含其他字符串。
结构体NSRange
typedef struct _NSRange {
unsigned int location;
unsigned int length;
} NSRange;
可以用三种方式创建新的NSRange。
第一种,直接给字段赋值:
NSRange range;
range.location = 17;
range.length = 4;
第二种,应用C语言的聚合结构赋值机制:
NSRange range = { 17, 4 };
第三种方式是Cocoa提供的一个快捷函数NSMakeRange();
NSRange range = NSMakeRange(17, 4);
[str substringToIndex :number]
substringToIndex:方法创建了一个子字符串,包括首字符到指定的索引数(number)。但不包括这个字符。比如参数是3时,表示从字符串中提取字符0、1、2,并返回结构字符串对象。
[str substringFromIndex :number]
substringFromIndex:方法返回了一个子字符串,它从接收者指定的索引字符开始,直到字符串的结尾。
常见的NSString方法
方法 | 描述 |
+(id) stringWithContentsOfFile : path encoding : enc error : err | 创建一个新字符串,并将其设置为path指定的文件的内容,使用字符编码enc,如果非零,则返回err中的错误 |
+(id) stringWithContentsOfURL : url encoding : enc error : err | 创建一个新字符串,并将其设置为url的内容,使用字符编码enc,如果非零,则返回err中的错误。 |
+(id) string | 创建一个新的字符串 |
+(id) stringWithString : nsstring | 创建一个新字符串,并将其设置为nsstring |
+(NSString *) stringWithFormat : format, arg1, arg2, arg3… | 通过指定的format和参数arg1,arg2,arg3..创建一个新字符串 |
-(id) initWithString : nsstring | 将新分配的字符串设置为nsstring |
-(id) initWithContentsOfFile : path encoding : enc error : err | 将字符串设置为path指定的文件的内容 |
-(id) initWithContentsOfURL : url encoding : enc error : err | 将字符串设置为(NSUrl *)url的内容,使用字符编码enc,如果非零,则返回err中的错误 |
-(NSUInterger) length | 返回字符串中的字符数目 |
-(unichar) characterAtIndex : i | 返回索引i的Unicode字符 |
-(NSString *) substringFromIndex : i | 返回从i开始(包括i)直到结尾的子字符串 |
-(NSString *) substringWithRange : range | 根据指定的范围返回子字符串 |
-(NSString *) substringToIndex : i | 返回从该字符串开始直到索引i(不包括i)的子字符串 |
-(NSComparator *) caseInsensitiveCompare : nsstring | 比较两个字符串,忽略大小写 |
-(NSComparator *) compare : nsstring | 比较两个字符串 |
-(BOOL) hasPrefix : nsstring | 测试字符串是否以nsstring开始 |
-(BOOL) hasSuffix : nsstring | 测试字符串是否以nsstring结尾 |
-(BOOL) isEqualToString : nsstring | 测试两个字符串是哦副相等 |
-(NSString *) capitalizedString | 返回每个单词首字母大写的字符串(每个单词的其余字母转换为小写) |
-(NSString *) lowercaseString | 返回转换为小写的字符串 |
-(NSString *) uppercaseString | 返回转换为大写的字符串 |
-(const char *) UTF8String | 返回转换为UTF-8C样式的字符串 |
-(double) doubleValue | 返回转换为double的字符串 |
-(float) floatValue | 返回字符串表示的双精度浮点数 |
-(NSInteger *) integerValue | 返回字符串的NSInteger整数表示 |
-(int) intValue | 返回转换为整数的字符串 |
常见的NSMutableString方法
方法 | 描述 |
+(id) stringWithCapacity : size | 创建一个初始包含size字符的字符串 |
-(id) initWithCapacity : size | 使用初始容量为size的字符来初始化字符串 |
-(void) setString : nsstring | 将字符串设置为nsstring |
-(void) appendString : nsstring | 在接收者的末尾附加nsstring |
-(void) deleteCharactersInRange : range | 删除指定range中的字符 |
-(void) insertString : nsstring atIndex : i | 以索引i为起始位置插入nsstring |
-(void) replaceCharactersInRange : range withString : nsstring | 使用nsstrng替换range指定的字符 |
-(void) replaceOccurrencesOfString : nsstring withString : nsstring2 options : opts range : range | 根据选项opts,在指定范围range中用nsstring2替换所有的nsstring。选项可以是以下值的按位或组合:NSBackwardsSearch(查找从范围尾部开始)、NSAnchoredSearch(nsstring必须匹配范围的开始)、NSLiteralString(执行逐字符比较)以及NSCaseInsensitiveSearch(忽略大小写) |
NSArray等Foundation集合是一个Cocoa类,用来存储对象的有序列表。换言之,不能将整数这样的基本数据类型(注意:结构属于基本类型)直接存储在数组之类的集合中。如果需要存储基本数据类型(包括char数据类型),可以使用NSNumber类,它会依据这些数据的类型创建对象。
常用的NSArray方法
方法 | 描述 |
+(id) arrayWithObjects : obj1, obj2, … nil | 创建一个新数组,obj1、obj2,…是其元素 |
-(BOOL) containsObject : obj | 确定数组中是否包含对象obj(使用isEqual:方法) |
-(NSUInteger) count | 数组中元素的个数 |
-(NSUInteger) indexOfObject : obj | 第一个包含对象obj的元素索引号(使用isEqual:方法) |
-(NSUInteger) indexOfObjectPassingTest : (BOOL(^)(id obj, NSUInteger idx, BOOL *stop)) block | 传递每个对象obj(带有索引号idx)到区块block中,如果obj通过测试返回YES,未通过返回NO,设置变量指针stop为YES结束处理 |
-(id) lastObject | 返回数组最后的对象 |
-(id) objectAtIndex : i | 存储在元素i的对象 |
-(void) makeObjectsPerformSelector : (SEL) seletor | 将seletor指示的消息发送给数组中的每个元素 |
-(void) enumerateObjectsUsingBlock : (void (^) (id obj, NSUInteger idx, BOOL *stop)) block | 对数组中的每个元素执行区块,传递数组中的对象obj和索引号idx,只有当所有的元素都遍历完成或设置变量指针stop为YES才处理结束 |
-(NSArray *) sortedArrayUsingSelector : (SEL)selector | 根据指定selector方法的比较器对数组进行排序 |
-(NSArray *) sortedArrayUsingComparator : (NSComparator) block | 通过执行区块block对数组进行排序 |
-(BOOL) writeToFile : path atomically : (BOOL)flag | 将数组写入指定的文件中,如果flag为YES,则先创建一个临时文件 |
常用的NSMutableArray方法
方法 | 描述 |
+(id) array | 创建一个空数组 |
+(id) arrayWithCapacity : size | 使用指定的初始size创建一个数组 |
-(id) initWithCapacity : size | 使用指定的初始size初始化新分配的数组 |
-(void) addObject : obj | 将对象obj添加到数组的末尾 |
-(void) insertObject : obj atIndex : i | 将对象obj插入数组的i元素 |
-(void) replaceObjectAtIndex : withObject : obj | 将数组中序号为i的对象用对象obj替换 |
-(void) removeObject : obj | 从数组中删除所有的obj |
-(void) removeObjectAtIndex : i | 从数据中删除元素i,将序号为i+1的对象移至数组的结尾 |
-(void) sortUsingSelector : (SEL) selector | 用selector指定的比较方法将数组排序 |
-(void) sortUsingComparator : (NSComparator) block | 通过执行区块block对数组进行排序 |
注:方法removeObject:、containsObject:和indexOfObject:都依赖isEqual:策略来决定两个对象是否相等。,必要时可编写自己的isEqual:方法判断两个对象是否相同。
NSValue包装和展开方法
Typedef数据类型 | 描述 | 包装方法 | 展开方法 |
CGpoint | x和y值组成的点 | valueWithPoint : | pointValue |
CGSize | 宽和高组成的尺寸 | valueWithSize : | sizeValue |
CGRect | 矩形包含原点和尺寸 | valueWithRect : | rectValue |
NSRange | 描述位置和大小的范围 | valueWithRange | rangeValue |
包装:将结构转化为对象的方式。
展开:从对象中解出基本类型。
常用的NSDictionary方法
方法 | 描述 |
+(id) dictionaryWithObjectsAndKeys : obj1, key1, obj2, key2, …, nil | 使用键-对象对{ key1, obj1 }、{ key2, obj2 }、…创建词典(注意,参数的顺序是:对象-键) |
-(id) initWithObjectsAndKeys : obj1, key1, obj2, key2, …,nil | 将新分配的词典初始化为键-对象对{ key1, obj1 }、{ key2, obj2 } |
-(NSArray *) allKeys | 返回一个数组包含词典中所有的键 |
-(NSUInteger) count | 返回词典中的记录数 |
-(NSEnumerator *) keyEnumerator | 为词典中所有的键返回一个NSEnumerator对象 |
-(NSArray *) keysSortedByValueUsingSelector : (SEL) selector | 为词典中的键数组,它根据selector指定的比较方法进行排序 |
-(NSEnumerator *) objectEnumerator | 为词典中的所有值返回一个NSEnumerator对象 |
-(id) objectForKey : key | 向词典为key的键添加obj,如果key已存在,则替换该值 |
词典是由键-对象对组成的数据集合。词典中的键必须是单值的,通常它们是字符串,但也可以是其他对象类型。和键关联的值可以是任何对象类型,但不能是nil。
和数组对象不一样,词典对象是无序的。所以,当枚举词典时,第一个放到词典中的键-对象并不一定是第一个取出。
如果需要以字母顺序显示词典中的内容,可以先取出词典中的所有键(使用allkeys方法),对它们排序,然后按照排好序的键从词典中取出所有的值。
常用的NSMutableDictionary方法
方法 | 描述 |
+(id) dictionaryWithCapacity : size | 使用一个初始指定的size创建可变词典 |
-(id) initWithCapacity : size | 将新分配的词典初始化为指定的size |
-(void) removeAllObjects | 删除词典中多有的记录 |
-(void) removeObjectForKey : key | 删除词典中指定key对应的记录 |
-(void) setObject : obj forKey : key | 向词典为key的键添加obj,如果key已存在,则替换该值 |
常用的NSSet方法
方法 | 描述 |
+(id) setWithObjects : obj1, obj2, …, nil | 使用一列对象创建新集合 |
-(id) anyObject | 返回集合中任一对象 |
-(id) initWithObjects : obj1, obj2, …, nil | 使用一列对象初始化新分配的集合 |
-(NSUInteger) count | 返回集合的成员个数 |
-(BOOL) containsObject : obj | 确定集合是否包含obj |
-(BOOL) member : obj | 使用isEqual:方法确定集合是否包含obj |
-(NSEnumerator *) objectEnumerator | 为集合中的所有对象返回一个NSEnumerator对象 |
-(BOOL) isSubsetOfSet : nsset | 确定接收者的每个成员是否都出现在nsset中 |
-(BOOL) intersectsSet : nsset | 确定接收者中是否至少有一个成员出现在对象nsset中 |
-(BOOL) isEqualToSet : nsset | 确定两个集合是否相等 |
常用的NSMutableSet方法
方法 | 描述 |
-(void) addObject : obj | 将对象obj添加到集合中 |
-(void) removeObject : obj | 从集合中删除对象obj |
-(void) removeAllObjects | 删除接收者的所有成员 |
-(void) unionSet : nsset | 将对象nsset的所有成员添加到接收者 |
-(void) minusSet : nsset | 从接收者中删除nsset的所有成员 |
-(void) intersectSet : nsset | 将接收者中所有不属于nsset的元素删除 |
NSIndexSet的一些方法
方法 | 描述 |
+(NSIndexSet) indexSet | 创建一个空的索引集合 |
-(BOOL) containIndex : idx | 如果索引集合包含索引idx,则返回YES,否则返回NO |
-(NSUinteger) count | 返回索引集合中索引的数量 |
-(NSUinteger) firstIndex | 返回集合中的第一个索引,如果集合为空,则返回NSNotFound |
-(NSUinteger) indexLessThanIndex : idx | 返回集合中小于idx的最接近的索引,如果没有小于idx的索引,则返回NSNotFound,类似indexLessThanOrEqualToIndex:、indexGreaterThanIndex和indexGreaterThanOrEqualIndex: |
-(NSUinteger) lastIndex | 返回集合的最后一个索引,如果集合为空,则返回NSNotFound |
-(NSIndexSet *) indexesPassingTest : (BOOL) (^) (NSUinteger idx, BOOL *stop) block | 区块应用在集合中的每个元素。idx添加到了NSIndexSet中返回YES,否则返回NO;设置指针变量stop为YES,表示中断处理 |
注:idx是一个NSUInteger整型。
indexOfObjectPassingTest:查找到一个匹配的元素(区块至少会返回一次YES),则返回从集合匹配到的最小索引值;否则返回NSNotFound。
indexOfObjectsPassingTest:方法可从数组中查找多个匹配对象,返回包含数组中满足条件的所有元素索引的NSIndexSet对象。
常见的NSFileManager文件方法
方法 | 描述 |
-(NSData *) contentsAtPath : path | 从文件中读取数据 |
-(BOOL) createFileAtPath : path contents : (NSData *) data attributes: attr | 向一个文件写入数据 |
-(BOOL) removeItemAtPath : path error : err | 删除一个文件 |
-(BOOL) moveItemAtPath : from toPath : to error : err | 重命名或者移动一个文件(to不能是已存在的) |
-(BOOL) copyItemAtPath: from toPath : to error : err | 复制文件(to不能是已存在) |
-(BOOL) contentsEqualAtPath : path1 andPath : path2 | 比较这两个文件的内容 |
-(BOOL) fileExistsAtPath : path | 测试文件是否存在 |
-(BOOL) isReadableFileAtPath : path | 测试文件是否存在,并且是否能执行读操作 |
-(BOOL) isWritableFileAtPath : path | 测试文件是否存在,并且是否能执行写操作 |
-(NSDictionary) attributesOfItemAtPath : path error: err | 获取文件的属性 |
-(BOOL) setAttributesOfItemAtPath : attr error : err | 更改文件的属性 |
注:path、path1、path2、from、to都是NSString对象;attr是一个NSDictionary对象;err是一个指向NSError对象的指针,能提供更多的错误信息。具有BOOL返回值的方法,即如果操作成功,就返回YES;否则就会返回NO。
属性字典包括各种信息,如文件的所有者、文件大小、文件的创建日期,等等。
常见的NSFileManager目录方法
方法 | 描述 |
-(NSString *) currentDirectoryPath | 获取当前目录 |
-(BOOL) changeCurrentDirectoryPath : path | 更改当前目录 |
-(BOOL) copyItemAtPath : from toPath : to error : err | 复制目录结构(to不能是已存在的) |
-(BOOL) createDirectoryAtPath : path withIntermediateDirectories : (BOOL)flag attributes : attr | 创建一个新目录 |
-(BOOL) fileExistsAtPath : path isDirectory : (BOOL *) flag | 测试文件是不是目录(flag中存储结果YES/NO) |
-(NSArray *) contentsOfDirectoryAtPath : path error : err | 列出目录内容 |
-(NSDirectoryEnumerator *) enumeratorAtPath : path | 枚举目录的内容 |
-(BOOL) removeItemAtPath : path error : err | 删除空目录 |
-(BOOL) moveItemAtPath : from toPath : to error : err | 重命名或移动一个目录(to不能是已存在的) |
常用的路径工具方法
方法 | 描述 |
+(NSString *) pathWithComponents:components | 根据components中的元素构造有效路径 |
-(NSArray *) pathComponents | 析构路径,获取组成次路径的各个部分 |
-(NSString *) lastPathComponent | 提取路径的最后一个组成部分 |
-(NSString *) pathExtension | 从路径的组后一个组成部分中提取其扩展名 |
-(NSString *) stringByAppendingPathComponent:path | 将path添加到现有路径的末尾 |
-(NSString *) stringByAppendingPathExtension:ext | 将指定的扩展名添加到路径的最后一个组成部分 |
-(NSString *) stringByDeletingLastPathComponent | 删除路径的最后一个组成部分 |
-(NSString *) stringByDeletingPathExtension | 从文件的最后一个部分删除扩展名 |
-(NSString *) stringByExpandingTildeInPath | 将路径中的代字符扩展成用户主目录(~)或指定用户的主目录(~user) |
-(NSStrng *) stringByResolvingSymlinksInPath | 尝试解析路径中符号链接 |
-(NSString *) stringByStandardizingPath | 通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径 |
注:components是一个NSArray ,它包含路径中每一部分的字符串对象;Path是一个字符串对象,它指定文件的路径;ext是路径扩展名的字符串对象(如@”mp4”)。
常用的路径工具函数
函数 | 描述 |
NSString *NSUserName(void) | 返回当前用户的登录名 |
NSString *NSFullUserName(void) | 返回当前用户的完整用户名 |
NSString *NSHomeDirectory(void) | 返回当前用户主目录的路径 |
NSString *NSHomeDirectoryForUser(NSString *user) | 返回用户user的主目录 |
NSString *NSTemporaryDirectory(void) | 返回可用于创建临时文件的路径目录 |
常用的iOS目录
目录 | 用途 |
Documents(NSDocumentDirectory) | 用于写入应用相关数据文件的目录。在iOS中写入这里的文件能够与iTunes共享并访问,存储在这里的文件会自动备份到云端 |
Library/Caches(NSCachesDirectory) | 用于写入应用支持文件的目录,保存应用程序再次启动需要的信息。iTunes不会对这个目录的内容进行备份。 |
tmp(use NSTemporaryDirectory()) | 这个目录用于存放临时文件,在程序终止时需要移除这些文件。当应用程序不再需要这些临时文件时,应该将其从这个目录中删除。 |
Library/Preferences | 这个目录包含应用程序的偏好设置文件。使用NSUserDefaults类进行偏好设置文件的创建、读取和修改。 |
NSProcessInfo类方法
方法 | 描述 |
+(NSProcessInfo *) processInfo | 返回当前进程的信息 |
-(NSArray *) argument | 以NSString对象组成的形式返回当前进程的参数 |
-(NSDictionary *) environment | 返回变量/值对词典,以描述当前的环境变量(比如PATH和HOME)及其值 |
-(int) processIdentifier | 返回进程标识符,它是操作系统赋予进程的唯一数字,用于识别每个正在运行的进程 |
-(NSString *) processName | 返回当前正在运行的进程 |
-(NSString *) globallyUniqueString | 每次调用这个方法时,都返回不同的单值字符串。可以用这个字符串生成单值临时文件名 |
-(NSString *) hostName | 返回主机系统的名称 |
-(NSUInteger *) operatingSystem | 返回表示操作系统的数字 |
-(NSString *) operatingSystemName | 返回操作系统的名称 |
-(NSString *) operatingSystemVersionString | 返回操作系统的当前版本 |
-(NSString *) setProcessName:(NSString *)name | 将当前进程名称设置为name。应该谨慎地使用这个方法,因为关于进程名称存在一些假设(比如用户默认的设置)。 |
常用的NSFileHandle方法
方法 | 描述 |
+(NSFileHandle *) fileHandleForReadingAtPath:path | 打开一个文件准备读取 |
+(NSFileHandle *) fileHandleForWritingAtPath:path | 打开一个文件准备写入 |
+(NSFileHandle *) fileHandleForUpdatingAtPath:path | 打开一个文件准备更新(读取和写入) |
+(NSFileHandle *) availableData | 从设备或者通道返回可用的数据 |
-(NSData *) readDataToEndOfFile | 读取其余的数据直到文件的末尾(最多UINT_MAX字节) |
-(NSData *) readDataOfLength:(NSUInteger)bytes | 从文件中读取指定字节的内容 |
-(void) writeData:data | 将data写入文件 |
-(unsigned long long) offsetInFile | 获取当前文件的偏移量 |
-(void) seekToFileOffset:offset | 设置当前文件的偏移量 |
-(unsigned long long) seekToEndOfFile | 将当前文件的偏移量定位到文件的尾 |
-(void) truncateFileAtOffset:offset | 将文件的长度设置为offset字节(如果需要,可以填充内容 |
-(void) closeFile | 关闭文件 |
注:fh是一个NSFileHandle对象;data是一个NSData对象;path是一个NSString对象,offset是一个unsignedlong long。