数组和类别



【说明】
    OC中使用两种数组,使用C的数组存放基本数据类型的数据或地址;
    使用OC的数组存放OC的对象地址。

一、不可变数组(NSArray)
1、创建
NSArray *ary1 = [[NSArray alloc]     
        initWithObjects:@"one",@"two",@"three",nil];
NSArray *ary2 = [NSArray
        arrayWithObjects:@"123",@"456",@"789",nil];
NSArray *ary3 = [[NSArray alloc] initWithArray:ary1];
NSArray *ary4 = [NSArray arrayWithArray:ary2];
//结尾不需要nil
NSArray *ary5 = @[@"abc",@"def",@"hij"];

2、字符串分割
//按照指定的字符串进行切割
NSArray *ary = [str componentsSeparatedByString:@"an"];
//按照指定的字符集合
NSCharacterSet *charSet = [NSCharacterSet
            characterSetWithCharactersInString:@"oa"];
NSArray *ary2 = [str
        componentsSeparatedByCharactersInSet:charSet];

3、字符串的拼接
//按照指定的字符串进行拼接
NSString *str2 = [ary componentsJoinedByString:@"*"];

4、获取元素个数
NSUInteger count = [ary count];

5、获取单个元素
//返回指定的元素
id obj = [ary objectAtIndex:1];
NSLog(@"%@", ary[0]);

6、数组的遍历
//遍历数组
for (int i=0; i<[ary count]; i++) {
    NSLog(@"%@", ary[i]);
}
//快速遍历
for (id obj in ary) {
    //obj每次循环指向数组中的一个元素,依次向后
    NSLog(@"%@",obj);
}
说明:
    1、在for-in中,break和continue同样可以使用
    2、在遍历过程中,不能修改数组

7、获取指定对象的索引
//查看对象在数组中的索引,找不到返回NSNotFound
NSUInteger index = [ary indexOfObject:@"too"];

8、判断是否包含指定对象
BOOL ret = [ary containsObject:@"too"];

二、可变数组(NSMutableArray)
1、设置(set)
[mAry setArray:@[@"one",@"two",@"three"]];

2、增加(add)
[mAry addObject:@"four"];
[mAry addObjectsFromArray:@[@"250",@"3"]];

3、插入(insert)
//在指定位置插入元素
[mAry insertObject:@"2" atIndex:2];

4、删除(remove)
//删除最后一个元素
[mAry removeLastObject];
//删除指定元素
[mAry removeObject:@"250"];
//删除指定位置的元素
[mAry removeObjectAtIndex:2];
//删除指定范围内的指定元素
[mAry removeObject:@"250" inRange:NSMakeRange(3, 3)];
//删除指定范围内的所有元素
[mAry removeObjectsInRange:NSMakeRange(2, 3)];
//删除某个数组指定的元素
[mAry removeObjectsInArray:@[@"250",@"2"]];
//删除所有元素
[mAry removeAllObjects];

5、替换(replace)
[mAry replaceObjectAtIndex:0 withObject:@"one"];

6、交换(exchange)
[mAry exchangeObjectAtIndex:0 withObjectAtIndex:2];

三、类别(Category)
【认识类别】
    给某个类打补丁的一个工具,也可分类管理成员方法

@interface NSString (Print)
- (void)print;
@end

@implementation NSString (Print)
- (void)print
{
    NSLog(@"%@", self);
}
@end

【使用说明】
    1、只能添加成员方法,不能添加成员变量,可以使用原类的成员变量
    2、给某个类添加一个类别相当于直接添加到原类中,
            但是并不会修改原类,其子类也可使用类别中的方法
    3、如只需在一个源文件中使用类别,可以将类别的接口
            和实现放在同一文件(当前源文件)中
    4、形如(3)的情况,可以省略类别的接口部分
    
【匿名类别】—— 类别的仕途不顺的远亲
    形式上省略名字的类别,也叫扩展,但是其作用于类别完全不同

【作用】
    1、成员方法的相互调用,以前只能下调上
    ==> 编译器已经支持相互调用
    2、添加不公开的成员变量
    ==> 可以放在实现部分的最上面
    3、声明不公开的成员方法
    ==> 方法只需实现不声明即可

四、零碎知识
【类(Class)】
    说明:
    1、Class是一种数据类型
    2、Class类型的变量用于存放类的类型

    使用:
    1、创建Class类型的变量
           //创建Class类型的变量(编译时)
    Class cls = [NSString class];
    //动态的创建(运行时)
    Class cls2 = NSClassFromString(@"NSString");
    2、可以创建特定类型的对象
            NSString *str = [cls stringWithString:@"hello"];
    3、可以判断某个对象是否属于某个类

【description方法】
    %@可以打印对象,其实打印的是description方法的返回;
    若不实现,默认打印对象的【类名+地址】

【数字类(NSNumber)】
    1、创建
       NSNumber *num1 = [[NSNumber alloc] initWithInt:250];
   NSNumber *num2 = [NSNumber numberWithFloat:3.14];
    2、转化为数值
       int value = [newNum intValue];
    3、转化为字符串
       NSString *str = [num2 stringValue];
    4、判断数字对象是否相等
       BOOL ret = [num1 isEqualToNumber:num2];
    5、比较数字对象的大小关系
        NSComparisonResult ret2 = [num1 compare:num2];

练习题:
1、创建一个数组,元素是@“One”,@“Two”,@“Three”,
        使用多种方法遍历打印数组的元素。
2、创建一个数组,元素是5个Dog类的对象地址,遍历数组,
        使每个元素执行bark函数。
3、创建一个数组,元素是两个字符串对象地址和三个Dog类的对象地址,
      遍历数组;如果是字符串那么输出"I am a string!"
      如果是 Dog 类的对象那么执行 bark 方法。
4、设计⼀个学生类,成员有姓名,年龄,学号,成绩。 要求,以上述
        每⼀成员,分别进行排序(学号按升序,成绩按降序,年龄升序,    
        名字降序)。
5、将一个字符串 @"我 爱 总 复 习" 按单词逆序,
        已知字符串中单词只通过空格分隔
        - (void)reverseWordsInString:(NSMutableString *)str;
6、有两个字符串@"This is a boy";@"really fucking bad";
        将这两个字符串单词,交叠,形成新的字符串
        @"This really is fucking a  bad boy"。

posted @ 2015-06-19 16:12  天使雨儿  阅读(131)  评论(0编辑  收藏  举报