在这篇文章中,我们将带领您了解iphone–如何通过NSString长度对NSMutableArray进行排序?的全貌,包括iosnsarraynsset的相关情况。同时,我们还将为您介绍有关coco
在这篇文章中,我们将带领您了解iphone – 如何通过NSString长度对NSMutableArray进行排序?的全貌,包括ios nsarray nsset的相关情况。同时,我们还将为您介绍有关cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失、copy修饰NSArray strong修饰NSMutableArray、ios – 在NSMutableArray中删除NSMutableDictionary内部、ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序的知识,以帮助您更好地理解这个主题。
本文目录一览:- iphone – 如何通过NSString长度对NSMutableArray进行排序?(ios nsarray nsset)
- cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失
- copy修饰NSArray strong修饰NSMutableArray
- ios – 在NSMutableArray中删除NSMutableDictionary内部
- ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序
iphone – 如何通过NSString长度对NSMutableArray进行排序?(ios nsarray nsset)
解决方法
NSSortDescriptor *sortDescriptor; sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"length" ascending:YES] autorelease]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; [myArray sortUsingDescriptors:sortDescriptors];
cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失
干杯,
道格
解决方法
当然,你可能会期待一些打击,因为字典必须做一个简单的数组不会做的额外散列.这是否“重大”很难说.
再次,衡量.
copy修饰NSArray strong修饰NSMutableArray
strong
与copy
修饰符
strong
修饰的属性,对该属性赋值时发生指针拷贝,即浅拷贝;copy
修饰的属性,对该属性赋值时发生内容拷贝,即深拷贝。(存在特殊Case)
通过重写对象的
setter
方法实现。
当将不可变对象赋值给
copy
修饰的不可变对象时,也是发生浅拷贝。这算是一种优化,验证见下文。
对数组而言,浅拷贝即拷贝了指向数组的指针;深拷贝即拷贝了数组中存储的内容,而这个深拷贝是通过调用copy
方法实现。
copy
与mutableCopy
方法
以下代码发生崩溃,为什么?
@property (copy, nonatomic) NSMutableArray *copAry;
- (void)testCrash {
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@1, @2, @3, nil];
self.copAry = arr;
[self.copAry removeObject:@1]; // 直接崩溃
NSLog(@"self.copyAry = %@", self.copAry);
}
arr
赋值给self.copAry
,依据上面原则,会调用copy
方法实现深拷贝。
注意: OC中不管是集合类对象(如:NSArray
、NSMutableArray
、NSSet
…)还是非集合类对象(如:NSString
…)接收到copy
和mutableCopy
消息时遵循以下原则:
copy
方法返回的都是不可变对象,因此如上代码中,self.copAry
即为不可变对象,对不可变对象调用可变对象的方法就会Crash;mutableCopy
方法返回的都是可变对象。
因此,如果我们使用
strong
来修饰self.copAry
,则在self.copAry = arr;
时发生浅拷贝,只是拷贝了arr
的指针,还是指向的原数组,还是可变对象。便不会发生Crash。
NSArray
为什么需要用copy
来修饰?
@property (strong, nonatomic) NSArray *arr1;
@property (copy, nonatomic) NSArray *arr2;
// 为什么 NSArray 需要使用 copy
- (void)testUseCopyWithAry {
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@(1), @(2), @(3), nil];
self.arr1 = arr;
self.arr2 = arr;
[arr addObject:@(4)];
NSLog(@"arr1 = %@, arr2 = %@", self.arr1, self.arr2);
/* 输出结果:
arr1 = (
1,
2,
3,
4
), arr2 = (
1,
2,
3
)
*/
}
如果对一个strong
修饰的NSArray
对象A赋值一个NSMutableArray
对象B,对于A对象而言它是不可变的,但是使用strong
修饰,赋值时发生了浅拷贝,A、B对象指向了同一个数组,因此对B的修改将会影响到A(如上代码)。一般这并不是我们期望的,因此我们使用copy
来修饰NSArray
对象来避免上述情况。
对象间赋值时测试例子
- (void)test01 {
NSArray *array = @[@1,@2,@3,@4];
NSArray *copyArr = [array copy];
NSArray *mCopyArr = [array mutableCopy];
NSMutableArray *mcArr = [array copy];
NSMutableArray *mmCopyArr = [array mutableCopy];
NSLog(@"array:%p--copyArr:%p--mCopyArr:%p--mcArr:%p---mmCopyArr:%p",array,copyArr,mCopyArr,mcArr,mmCopyArr);
/* 输出结果
array: 0x60000024ce10
copyArr: 0x60000024ce10
mCopyArr: 0x60000024cd80
mcArr: 0x60000024ce10
mmCopyArr: 0x60000024ce70
*/
}
- (void)test02 {
NSArray *tarray = @[@1,@2,@3,@4];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:tarray];
NSArray *copyArr = [array copy];
NSArray *mCopyArr = [array mutableCopy];
NSMutableArray *mcArr = [array copy];
NSMutableArray *mmCopyArr = [array mutableCopy];
NSLog(@"array:%p--copyArr:%p--mCopyArr:%p--mcArr:%p---mmCopyArr:%p",array,copyArr,mCopyArr,mcArr,mmCopyArr);
/* 输出结果
array: 0x60000024cd20
copyArr: 0x60000024cc90
mCopyArr: 0x60000024ce40
mcArr: 0x60000024cde0
mmCopyArr: 0x60000024d020
*/
}
总结:
- 对不可变对象(如:
NSArray
对象)发送copy
消息,返回不可变对象,这其中并没有发生深拷贝,仅是拷贝了指针而已; - 对不可变对象发送
mutableCopy
消息,返回可变对象;对可变对象发送copy
消息,返回不可变对象;对可变对象发送mutableCopy
消息,返回可变对象,这其中均发生了深拷贝,即拷贝了对象的内容。
当然在 iOS 中并不是所有的对象都支持copy
,mutableCopy
,遵守 NSCopying
协议的类可以发送 copy
消息,遵守NSMutableCopying
协议的类才可以发送 mutableCopy
消息。
假如发送了一个没有遵守上诉两协议而发送 copy
或者 mutableCopy
, 那么就会发生异常。但是默认情况下iOS中的类并没有遵守上述两个协议。
如果想使用copy
那么就必须遵守NSCopying
, 并且实现 copyWithZone:
方法,如果想使用mutableCopy
那么就必须遵守 NSMutableCopying
, 并且实现 mutableCopyWithZone:
方法。
ios – 在NSMutableArray中删除NSMutableDictionary内部
这是我的Array和带有NSMutableDictionary的NSMutableArray
Array Value = ( { "sub_desc" = "sub cat description of Laptop"; "sub_name" = Laptop; },{ "sub_desc" = "sub cat description of Printers"; "sub_name" = Printers; },"<null>","<null>" )
我试图删除价值观,任何想法?
我的segue是这样的
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([segue.identifier isEqualToString:@"MySegue"]) { ChildTableViewController *myNextPage = [segue destinationViewController]; if ([myNextPage isKindOfClass:[ChildTableViewController class]]){ Nsstring *key = [[[parsedData listPopulated]objectAtIndex:self.tableView.indexPathForSelectedRow.row]valueForKey:@"name"]; myNextPage.childData = [[parsedData childPopulated]valueForKey:key]; } } }
和childData是我的Child View Controller中的NSMutableArray,childPopulated也是一个NSMutableArray,我插入NSMutableDictionary.
解决方法
[NSMutableArray removeObject:]
:
Removes all occurrences in the array of a given object.
NSMutableArray *array = ...; [array removeObject:@"<null>"];
注意:您的数组包含字典和字符串对象的混合;不仅仅是字典对象.
ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序
NSArray *objects = @[@"Stin",@"Foo",@"Ray",@"Space"];
现在我需要根据字符串的顺序对此数组进行排序.
NSArray *sortOrder = @[@"John",@"Space",@"Star",@"Stin"];
所以答案应该是
NSArray *sorted = @[@"Foo",@"Stin"];
我怎样才能做到这一点?
回答:
根据dasblinkenlight的接受的答案,我做了以下,它有魅力.
NSMutableArray *objects = @[@"Star",@"Stin",@"John"]; NSArray *sortOrder = @[@"John",@"Stin"]; [objects sortUsingComparator:^NSComparisonResult(id obj1,id obj2) { int index1 = [sortOrder indexOfObject:obj1]; int index2 = [sortOrder indexOfObject:obj2]; if (index1 > index2) return NSOrderedDescending; if (index1 < index2) return NSOrderedAscending; return NSOrderedSame; }];
解决方法
今天关于iphone – 如何通过NSString长度对NSMutableArray进行排序?和ios nsarray nsset的讲解已经结束,谢谢您的阅读,如果想了解更多关于cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失、copy修饰NSArray strong修饰NSMutableArray、ios – 在NSMutableArray中删除NSMutableDictionary内部、ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序的相关知识,请在本站搜索。
本文标签: