//创建数组
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);
扩张 关于深复制
和浅复制
首先先看一下下面的一段代码:
-
#import
-
-
int main(int argc, const char * argv[])
- {
-
-
@autoreleasepool {
-
-
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
-
[NSMutableString stringWithString:@"one"],
-
[NSMutableString stringWithString:@"two"],
-
[NSMutableString stringWithString:@"three"],
-
nil
-
];
-
NSMutableArray *dataArray2;
-
NSMutableString *mStr;
-
-
NSLog(@"dataArray: ");
-
for(NSString *elem in dataArray)
-
NSLog(@" %@", elem);
-
-
//执行一个拷贝,然后改变其中的一个字符串(浅复制)
-
dataArray2 = [dataArray mutableCopy];
-
-
//这种方式会同时改变连个数组中的对象
-
mStr = [dataArray objectAtIndex:0];
-
[mStr appendString:@"ONE"];
-
-
NSLog(@"dataArray:");
-
for(NSString *elem in dataArray)
-
NSLog(@" %@",elem);
-
-
NSLog(@"dataArray2:");
-
for(NSString *elem in dataArray2)
-
NSLog(@" %@",elem);
-
-
[dataArray2 release];
-
}
-
return 0;
- }
使用上述方法的执行结果如下:
http://my.csdn.net/uploads/201207/30/1343615300_4189.png- NSArray的使用" />
注意:原始数组及其副本中的第一个元素的值:他们都被修改了。为什么会产生这样的结果呢?
或许你能理解为什么dataArray的第一个元素发生改变,但是不明白为什么它的副本也会改变。
这与默认的浅复制方式有关。它意味着使用mutableCopy方式复制数组时,在内存中为新的数组对象分配了空间,并且将单个元素复制到新的数组
中。然而将原始数组中每个元素复制到新位置意味着:仅将引用从一个数组元素复制到另一个数组元素。这样做的最终结果,就是这两个数组中的元素都指向内存中
的同一个字符串。这与将一个对象赋值给另一个对象没有什么不同。
要为数组中每个元素创建完全不同的副本,需要执行所谓的深复制。这就意味着要创建数组中的每个对象内容的副本,而不仅是这些对象的引用的副本(并且考虑一下,如果一个数组中的元素本身是数组对象时,深复制意味着该如何处理?)
假设想要更改其中一个集合而不是他的副本,那么可能要为单个元素创建自己的副本。例如假设想要更改代码中的dataArray2的第一个元素,但
不更改dataArray的第一个元素,可以创建一个新的字符串(使用stringWithString:之类的方法)并将它存储到dataArray2
的第一个位置,如下所示:
-
//这种方式只会改变一个数组中的对象,而对另外一个没有影响
-
mStr = [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];
-
[mStr appendString:@"ONE"];
-
[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
)