object-c 之NSArray和NSMutableArray的一些操作

还好有个双休日来减缓下工作上的压力,来增加自己的学习时间。

记得刚接触NSArray时,顿时就感觉像是Java里面的List,立马对老大说的,语言都是想通的,都是借鉴的,多学几门语言就可以体会到了。不过NSArray比List要强大多了。然而,在实际的项目中,对NSMutableArray更为偏爱。像上篇说过的一样,带有Mutable的都是可变的,就会提供一些额外很有用途的方法。

在ios6以后,数组的创建有了更多的方法,作为ios6的一个新特性就是可以用@符号来简写下、一些创建时候的方法名。

就是关于简写,这里记得在哪里看到过,把它帖过来

简写

NSNumber

所有的[NSNumber numberWith…:]方法都可以简写了:

  • [NSNumber numberWithChar:‘X’] 简写为 @‘X’;
  • [NSNumber numberWithInt:12345] 简写为 @12345
  • [NSNumber numberWithUnsignedLong:12345ul] 简写为 @12345ul
  • [NSNumber numberWithLongLong:12345ll] 简写为 @12345ll
  • [NSNumber numberWithFloat:123.45f] 简写为 @123.45f
  • [NSNumber numberWithDouble:123.45] 简写为 @123.45
  • [NSNumber numberWithBool:YES] 简写为 @YES

嗯…方便很多啊~以前最讨厌的就是数字放Array里还要封装成NSNumber了…现在的话直接用@开头接数字,可以简化不少。

NSArray

部分NSArray方法得到了简化:

  • [NSArray array] 简写为 @[]
  • [NSArray arrayWithObject:a] 简写为 @[ a ]
  • [NSArray arrayWithObjects:a, b, c, nil] 简写为 @[ a, b, c ]

可以理解为@符号就表示NS对象(和NSString的@号一样),然后接了一个在很多其他语言中常见的方括号[]来表示数组。实际上在我们使用简写时,编译器会将其自动翻译补全为我们常见的代码。比如对于@[ a, b, c ],实际编译时的代码是

1
2
3
4
// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects)/ sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

需要特别注意,要是a,b,c中有nil的话,在生成NSArray时会抛出异常,而不是像[NSArray arrayWithObjects:a, b, c, nil]那样形成一个不完整的NSArray。其实这是很好的特性,避免了难以查找的bug的存在。

NSDictionary

既然数组都简化了,字典也没跑儿,还是和Perl啊Python啊Ruby啊很相似,意料之中的写法:

  • [NSDictionary dictionary] 简写为 @{}
  • [NSDictionary dictionaryWithObject:o1 forKey:k1] 简写为 @{ k1 : o1 }
  • [NSDictionary dictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 简写为 @{ k1 : o1, k2 : o2, k3 : o3 }

和数组类似,当写下@{ k1 : o1, k2 : o2, k3 : o3 }时,实际的代码会是

1
2
3
4
5
// compiler generates: 
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count];

Mutable版本和静态版本

上面所生成的版本都是不可变的,想得到可变版本的话,可以对其发送-mutableCopy消息以生成一份可变的拷贝。比如

1
2
3
4
5
6
NSMutableArray *mutablePlanets = [@[
                                  @"Mercury", @"Venus",
                                  @"Earth", @"Mars",
                                  @"Jupiter", @"Saturn",
                                  @"Uranus", @"Neptune" ]
                                  mutableCopy];

另外,对于标记为static的数组(没有static的字典..哈希和排序是在编译时完成的而且cocoa框架的key也不是常数),不能使用简写为其赋值(其实原来的传统写法也不行)。解决方法是在类方法+ (void)initialize中对static进行赋值,比如:

1
2
3
4
5
6
static NSArray *thePlanets;
+ (void)initialize {
    if (self == [MyClass class]) {
        thePlanets = @[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ];
    }
}

NSArray 强大之处在于它里面存放的可以是任意的对象,对,只要是对象就行,基本数据类型就不行的,需要先转成对象才能存储。
- (BOOL)containsObject:(id)anObject; 要判断数组是否包含某个对象
- (id)objectAtIndex:(NSUInteger)index; 根据某个下标来获取某个对象   和  - (NSUInteger)indexOfObject:(id)anObject; 正好想法,返回某个对象在数组中的下标
- (NSUInteger)count; 用来返回数组的大小 也是非常有用的方法
Tips:当然,为了防止数组越界而造成程序奔溃,苹果允许我们向原有的方法中添加自己的方法,这就要用到类别(category)了,回头要温习下了。
说到了在实际项目中用到的可能都是NSMutableArray,所以要主要记住其一些方法了。
- (void)addObjectsFromArray:(NSArray *)otherArray;  从数组中把它的对象拿过来,
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2; 根据传人的参数将2个对象位置对换
- (void)removeAllObjects; 清空数组
- (void)removeObject:(id)anObject; 删除某一个对象
- (void)removeObjectsInArray:(NSArray *)otherArray; 删除otherArray 中的每一个对象
- (instancetype)initWithCapacity:(NSUInteger)numItems; 很重要的一个初始化的方法。按照numItems依次增加数组的容量
在数组中很多时候需要去遍历整个数组,在数组遍历的时候可以利用枚举类 NSEnumerator 来进行遍历,也可以利用快速枚举for语句来遍历
NSMutableArray *dataArray = [NSMutableArray arrayWithCapacity:5];
for (int i = 0; i < 6; i++){
    NSString *string = [NSString stringWithFormat:@"测试数据 %d", i];
    [dataArray addObject:string];
}
for (NSString *string in dataArray)//for ( in ) 快速枚举 //类型要一致
{
     NSLog(@"%@", string);
}

 NSEnumerator *enumtor = [dataArray objectEnumerator];
 while ([enumtor nextObject] != nil)
 {
      NSLog(@"%@", [enumtor nextObject]);
 }
快速枚举for in 在开发中用到的地方很多


你可能感兴趣的:(ios学习之Object—c)