OBJECTIVE-C编程(第2版)学习笔记3

    可以像这样创建一个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!";
OBJECTIVE-C编程(第2版)学习笔记3_第1张图片

    由于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];


    那么去哪里寻找需要用的方法呢?苹果公司在它的API里提供了每个类的类参考(class reference)。类参考列出了一个类的所有方法,以及它们的基本用法。

    打开Xcode,选择Help - > Documentation and API Reference,打开Xcode的文档浏览窗口。

    在顶部的搜索栏中,输入NSSting。

OBJECTIVE-C编程(第2版)学习笔记3_第2张图片


    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也可以用字面量语法创建实例。数组的内容写在方括号里,使用逗号分隔,前方带有@符号,不必另外发送创建实例的消息。
    NSArray的实例是无法改变的。一旦NSArray实例被创建后,就无法添加或删除数组里的指针,也无法改变数组的指针顺序。

    NSArray中的指针是有序排列的,并可以通过相应的索引(index)来存取。索引以0为起始:索引0的位置保存第一个指针,索引1的位置保存第二个指针,依次类推。

    如果要存取某个数组中的指针,则可以使用数组名加相应的索引,索引用方括号包围起来。

#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;
}
OBJECTIVE-C编程(第2版)学习笔记3_第3张图片
    可以使用for循环来遍历数组。

#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];

    结束处的nil告诉方法停止运行。所以,这个NSDate数列拥有三个指针对象。(如果没有写nil,则程序很可能会崩溃,编译器会警告这个错误。)

    用来访问dateList数组中指针的语句称为下标。在还没有下标语法的时候,开发者一般使用ObjectAtIndex:方法来访问数组中的指针:

//打印NSDate对象
NSLog(@"The first date is %@", [dateList objectAtIndex:0]);
NSLog(@"The third date is %@", [dateList objectAtIndex:2]);

    






你可能感兴趣的:(Objective-C)