加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

NS类 - NSArray的使用

(2013-04-18 19:51:04)
标签:

nsarray

分类: Mac/IOS那些事
  //创建数组

    NSArray *array = [[NSArray alloc] initWithObjects:

    @"One",@"Two",@"Three",@"Four",nil];

 

    self.dataArray = array;

    [array release];

 

    //- (unsigned) Count;数组所包含对象个数;

    NSLog(@"self.dataArray cound:%d",[self.dataArray count]);

 

    //- (id) objectAtIndex: (unsigned int) index;获取指定索引处的对象;

    NSLog(@"self.dataArray cound 2:%@",[self.dataArray objectAtIndex:2]);

 

 

    //从一个数组拷贝数据到另一数组(可变数级)  

 

    //arrayWithArray:

    NSArray *array1 = [[NSArray alloc] init];

    NSMutableArray *MutableArray = [[NSMutableArray alloc] init];

    NSArray *array [NSArray arrayWithObjects:

                      @"a",@"b",@"c",nil];

    NSLog(@"array:%@",array);

    MutableArray = [NSMutableArray arrayWithArray:array];

    NSLog(@"MutableArray:%@",MutableArray);

 

    array1 = [NSArray arrayWithArray:array];

    NSLog(@"array1:%@",array1);

 

 

    //Copy

 

    //id obj;

    NSMutableArray *newArray = [[NSMutableArray alloc] init];

    NSArray *oldArray = [NSArray arrayWithObjects:

                         @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];

 

    NSLog(@"oldArray:%@",oldArray);

    for(int i = 0; i < [oldArray count]; i++)

    {        

        obj = [[oldArray objectAtIndex:i] copy];

        [newArray addObject: obj];

    }

    //     

    NSLog(@"newArray:%@", newArray);

    [newArray release];

 

 

    //快速枚举

 

    //NSMutableArray *newArray = [[NSMutableArray alloc] init];

    NSArray *oldArray = [NSArray arrayWithObjects:

                         @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];    

    NSLog(@"oldArray:%@",oldArray);

 

    for(id obj in oldArray)

    {

        [newArray addObject: obj];

    }

    //     

    NSLog(@"newArray:%@", newArray);

    [newArray release];    

 

 

    //Deep copy

 

    NSMutableArray *newArray = [[NSMutableArray alloc] init];

    NSArray *oldArray = [NSArray arrayWithObjects:

                         @"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];    

    NSLog(@"oldArray:%@",oldArray);    

    newArray = (NSMutableArray*)CFPropertyListCreateDeepCopy(kCFAllocatorDefault,(CFPropertyListRef)oldArray, kCFPropertyListMutableContainers);

    NSLog(@"newArray:%@", newArray);

    [newArray release];    

 

 

    //Copy and sort

 

    NSMutableArray *newArray = [[NSMutableArray alloc] init];

    NSArray *oldArray = [NSArray arrayWithObjects:

                         @"b",@"a",@"e",@"d",@"c",@"f",@"h",@"g",nil];    

    NSLog(@"oldArray:%@",oldArray);

    NSEnumerator *enumerator;

    enumerator = [oldArray objectEnumerator];

    id obj;

    while(obj = [enumerator nextObject])

    {

        [newArray addObject: obj];

    }

    [newArray sortUsingSelector:@selector(compare:)];

    NSLog(@"newArray:%@", newArray);

    [newArray release];

 

 

 

    //切分数组

 

    //从字符串分割到数组- componentsSeparatedByString:

    NSString *string [[NSString alloc] initWithString:@"One,Two,Three,Four"];

    NSLog(@"string:%@",string);    

    NSArray *array [string componentsSeparatedByString:@","];

    NSLog(@"array:%@",array);

    [string release];

 

 

    //从数组合并元素到字符串- componentsJoinedByString:

    NSArray *array [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];

    NSString *string [array componentsJoinedByString:@","];

    NSLog(@"string:%@",string);


扩张 关于深复制 和浅复制


首先先看一下下面的一段代码:

  1. #import   
  2.   
  3. int main(int argc, const char argv[])  
  4.  
  5.   
  6.     @autoreleasepool  
  7.           
  8.         NSMutableArray *dataArray [NSMutableArray arrayWithObjects:  
  9.                                      [NSMutableString stringWithString:@"one"],  
  10.                                      [NSMutableString stringWithString:@"two"],  
  11.                                      [NSMutableString stringWithString:@"three"],  
  12.                                      nil  
  13.                                      ];  
  14.         NSMutableArray *dataArray2;  
  15.         NSMutableString *mStr;  
  16.           
  17.         NSLog(@"dataArray:   ");  
  18.         for(NSString *elem in dataArray)  
  19.             NSLog(@  %@"elem);  
  20.           
  21.         //执行一个拷贝,然后改变其中的一个字符串(浅复制)  
  22.         dataArray2 [dataArray mutableCopy];  
  23.           
  24.         //这种方式会同时改变连个数组中的对象  
  25.         mStr [dataArray objectAtIndex:0];  
  26.         [mStr appendString:@"ONE"];  
  27.                   
  28.         NSLog(@"dataArray:");  
  29.         for(NSString *elem in dataArray)  
  30.             NSLog(@ %@",elem);  
  31.           
  32.         NSLog(@"dataArray2:");  
  33.         for(NSString *elem in dataArray2)  
  34.             NSLog(@ %@",elem);  
  35.           
  36.         [dataArray2 release];  
  37.      
  38.     return 0;  
  39.  

使用上述方法的执行结果如下:

http://my.csdn.net/uploads/201207/30/1343615300_4189.pngNSArray的使用" />

注意:原始数组及其副本中的第一个元素的值:他们都被修改了。为什么会产生这样的结果呢?

或许你能理解为什么dataArray的第一个元素发生改变,但是不明白为什么它的副本也会改变。

这与默认的浅复制方式有关。它意味着使用mutableCopy方式复制数组时,在内存中为新的数组对象分配了空间,并且将单个元素复制到新的数组 中。然而将原始数组中每个元素复制到新位置意味着:仅将引用从一个数组元素复制到另一个数组元素。这样做的最终结果,就是这两个数组中的元素都指向内存中 的同一个字符串。这与将一个对象赋值给另一个对象没有什么不同。

要为数组中每个元素创建完全不同的副本,需要执行所谓的深复制。这就意味着要创建数组中的每个对象内容的副本,而不仅是这些对象的引用的副本(并且考虑一下,如果一个数组中的元素本身是数组对象时,深复制意味着该如何处理?)

假设想要更改其中一个集合而不是他的副本,那么可能要为单个元素创建自己的副本。例如假设想要更改代码中的dataArray2的第一个元素,但 不更改dataArray的第一个元素,可以创建一个新的字符串(使用stringWithString:之类的方法)并将它存储到dataArray2 的第一个位置,如下所示:

  1. //这种方式只会改变一个数组中的对象,而对另外一个没有影响  
  2.         mStr [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];  
  3.         [mStr appendString:@"ONE"];  
  4.         [dataArray2 replaceObjectAtIndex:0 withObject:mStr];  

如果顺利的话,你会发现即使替换了数组中的对象之后,mStr和dataArray2的第一个元素仍指向内存中的同一个对象。这意味着随后在程序中对 mStr做的任何修改,也将会更改数组 的第一个元素。如果这不是你想要的,则可以总是释放mStr,并分配新实例,因为对象会被 replaceObject:atIndex:withObject:方法自动保持。


数组去除重复的值 
有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型。今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下。
1.利用NSDictionary的AllKeys(AllValues)方法
可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的。
示例代码:

    NSArray *arr = @[@111,@222,@111];

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    for (NSNumber *number in arr) {

        [dict setObject:number forKey:number];

    }

    NSLog(@"%@",[dict allValues]);

输出结果为:

 

2013-05-21 12:03:49.449 test1[4377:c07] (

    111,

    222

)


2.利用NSSet的AllObjects方法
这种方法更快,利用NSSet不会添加重复元素的特性。不过去重的数组没有进行排序,如果需要排序,可以使用NSSortDescriptor类。
示例代码:

    NSArray *arr = @[@111,@222,@111];

    NSSet *set = [NSSet setWithArray:arr];

    NSLog(@"%@",[set allObjects]);

输出结果为:

 

2013-05-21 12:06:26.508 test1[4547:c07] (

    111,

    222

)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有