可以像这样创建一个NSString实例:
NSString *lament = @"Why me!?";
从以上这行代码中可以看到,我们并没有明确地发送消息给NSString类,让它创建一个实例。@". . ."是Objective-C语言中的一个缩写,代表根据给定的字符串创建一个NSString对象。我们称这种缩写为字面量语法(literal syntax)。创建的实例称为NSString的字面量实例,或者更通俗地称为NSString字面量。
NSString实例可以保存任意Unicode字符。如果需要插入非ASCII码字符,则可以使用\u,后面加上该字符的十六进制Unicode编码。例如,卡牌中的红心符号的十六进制Unicode编码是0x2661:
NSString *slogan = @"I \u2661 New York!";
由于NSString对象可以保存Unicode字符,所以可以处理不同语言的字符串,创建多语言的应用就更加方便。
我们经常需要创建动态字符串。也就是说,需要创建不清楚内容的字符串,该字符串的内容需要等到程序运行的时候才能知道。这时可以使用stringWithFormat:类方法来创建动态字符串:
NSString *dateString = [NSString stringWithFormat:@"The date is %@",now];
stringWithFormat:方法后面跟着一个格式字符串作为参数,这个格式字符串带有一个格式说明符和一个变量,变量的值会被用来替换格式说明符。
NSString类很常用,因为它像其他Objective-C类一样,包含很多有用的方法。以下是一些常用的NSString方法。
获取字符串中字符的数量,可以使用length方法:
NSUInteger length;
这个方法会返回一个NSUInteger值,不带参数。NSUInteger是Foundation框架中的一个数字类型,它其实就等于无符号长整型。
NSUInteger charCount = [dateString length];
如果要查看一个字符串是否和另一个字符串相等,则可以使用isEqualToString:方法:
BOOL isEqualToString:(NSString *)other;
该实例方法逐一检查两个字符串的字母是否相同。也就是将作为实参的字符串和接收isEqualToString:消息的字符串做比较。然后返回一个BOOL值,报告两个字符串是否相等。
if([slogan isEqualToString:lament]){
NSLog(@"%@ and %@ are equal",slogan,lament);
}
如果要把一个字符串变成大写形式,则可以使用uppercaseString方法:
NSString * uppercaseString;
NSString *angryText = @"That makes me so mad!";
NSString *reallyAngryText = [angryText uppercaseString];
打开Xcode,选择Help - > Documentation and API Reference,打开Xcode的文档浏览窗口。
在顶部的搜索栏中,输入NSSting。
NSArray也是一个常用的Objective-C类。NSArray实例可以保存一组指向其他对象的指针。
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建三个NSDate对象
NSDate *now = [NSDate date];
NSDate *tomorrow = [now dateByAddingTimeInterval:24.0*60.0*60.0];
NSDate *yesterday = [now dateByAddingTimeInterval:-24.0*60.0*60.0];
//创建一个数组包含这三个NSDate对象
NSArray *dateList = @[now, tomorrow, yesterday];
}
return 0;
}
与NSString类似,NSArray也可以用字面量语法创建实例。数组的内容写在方括号里,使用逗号分隔,前方带有@符号,不必另外发送创建实例的消息。
如果要存取某个数组中的指针,则可以使用数组名加相应的索引,索引用方括号包围起来。
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建三个NSDate对象
NSDate *now = [NSDate date];
NSDate *tomorrow = [now dateByAddingTimeInterval:24.0*60.0*60.0];
NSDate *yesterday = [now dateByAddingTimeInterval:-24.0*60.0*60.0];
//创建一个数组包含这三个NSDate对象
NSArray *dateList = @[now, tomorrow, yesterday];
//输出其中的两个对象
NSLog(@"The first date is %@",dateList[0]);
NSLog(@"The third date is %@",dateList[2]);
//包含多少个对象
NSLog(@"There are %lu dates",[dateList count]);
}
return 0;
}
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建三个NSDate对象
NSDate *now = [NSDate date];
NSDate *tomorrow = [now dateByAddingTimeInterval:24.0*60.0*60.0];
NSDate *yesterday = [now dateByAddingTimeInterval:-24.0*60.0*60.0];
//创建一个数组包含这三个NSDate对象
NSArray *dateList = @[now, tomorrow, yesterday];
//遍历数组
NSUInteger dateCount = [dateList count];
for(int i = 0; i < dateCount; i++){
NSDate *d = dateList[i];
NSLog(@"Here is a date: %@",d);
}
}
return 0;
}
由于程序员需要经常遍历数组,所以Objective-C就添加了一种简化的for循环语法,新的循环语法称为快速枚举(fast enumeration)。它能够高效的地遍历数组中的所有元素。使用快速枚举省去了对数组计数的麻烦。
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建三个NSDate对象
NSDate *now = [NSDate date];
NSDate *tomorrow = [now dateByAddingTimeInterval:24.0*60.0*60.0];
NSDate *yesterday = [now dateByAddingTimeInterval:-24.0*60.0*60.0];
//创建一个数组包含这三个NSDate对象
NSArray *dateList = @[now, tomorrow, yesterday];
//遍历数组
for(NSDate *d in dateList){
NSLog(@"Here is a date: %@",d);
}
}
return 0;
}
NSMutableArray实例和NSArray实例类似,但是可以添加、删除或对指针重新进行排序。NSMutableArray是NSArray的子类。
使用NSMutableArray和NSMutableArray类的方法改写前面的程序,代码如下:
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建三个NSDate对象
NSDate *now = [NSDate date];
NSDate *tomorrow = [now dateByAddingTimeInterval:24.0*60.0*60.0];
NSDate *yesterday = [now dateByAddingTimeInterval:-24.0*60.0*60.0];
//创建空数组
NSMutableArray *dateList = [NSMutableArray array];
//将两个NSDate对象加入新创建的数组
[dateList addObject:now];
[dateList addObject:tomorrow];
//将yesterday指针插入数组的起始位置
[dateList insertObject:yesterday atIndex:0];
//遍历数组
for(NSDate *d in dateList){
NSLog(@"Here is a date: %@",d);
}
//删除yesterday指针
[dateList removeObjectAtIndex:0];
NSLog(@"Now the first date is %@",dateList[0]);
}
return 0;
}
上述程序使用了array类方法来创建NSMutableArray。这个方法会返回一个空数组,可以给这个空数组添加对象。使用alloc和init得到相同的输出结果:
NSMutableArray *dateList = [[NSMutableArray alloc] init];
程序中使用了addObject:方法来给NSMutableArray添加对象。这个方法会在数组的尾部添加对象。如果要将对象添加到一个特定的索引上,则可以使用insertObject:atIndex:方法。随着对象的逐渐增加,数组也会随之变长来保存这些对象。
删除数组中的对象,可以使用removeObject:atIndex:方法,而数组对象的计数也会随之减少。例如,删除yesterday指针后,如果访问dateList数组中索引为2的对象,程序就会崩溃。
还有一点需要注意,使用快速枚举遍历NSMutableArray时,不能在枚举过程中增加或者删除数组中的指针。如果遍历时需要添加或删除指针,则需要使用标准的for循环。
还没有字面量语法的时候,开发者只能使用arrayWithObjects:类方法来创建NSArray实例:
//创建一个NSArray对象并包含之前创建的三个NSDate对象(nil是结束标记)
NSArray *dateList = [NSArray arrayWithObjects:now, tomorrow, yesterday, nil];
用来访问dateList数组中指针的语句称为下标。在还没有下标语法的时候,开发者一般使用ObjectAtIndex:方法来访问数组中的指针:
//打印NSDate对象
NSLog(@"The first date is %@", [dateList objectAtIndex:0]);
NSLog(@"The third date is %@", [dateList objectAtIndex:2]);