GVKun编程网logo

iphone – 如何通过NSString长度对NSMutableArray进行排序?(ios nsarray nsset)

4

在这篇文章中,我们将带领您了解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)

iphone – 如何通过NSString长度对NSMutableArray进行排序?(ios nsarray nsset)

我有一个NSMutableArray包含各种长度的Nsstrings.我将如何按字符串长度排序数组?

解决方法

看到我的答案 sorting arrays with custom objects:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"length"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

[myArray sortUsingDescriptors:sortDescriptors];

cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失

cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失

我正在考虑使用NSMutableDictionary代替我当前的NSMutableArray.这主要是出于KVC / KVO的原因.该集合将在我的绘图方法的内循环中经历重度变异.如果我继续进行此次更换,我是否可以预期会受到重大影响?

干杯,
道格

解决方法

唯一可以确定的方法是衡量.我们都没有足够的知识来了解NSMutableDictionary和NSMutableArray的实现是如何工作的,所以毫无疑问.

当然,你可能会期待一些打击,因为字典必须做一个简单的数组不会做的额外散列.这是否“重大”很难说.

再次,衡量.

copy修饰NSArray strong修饰NSMutableArray

copy修饰NSArray strong修饰NSMutableArray

strongcopy修饰符

  • strong修饰的属性,对该属性赋值时发生指针拷贝,即浅拷贝;
  • copy修饰的属性,对该属性赋值时发生内容拷贝,即深拷贝。(存在特殊Case)

通过重写对象的setter方法实现。

当将不可变对象赋值给copy修饰的不可变对象时,也是发生浅拷贝。这算是一种优化,验证见下文。

对数组而言,浅拷贝即拷贝了指向数组的指针;深拷贝即拷贝了数组中存储的内容,而这个深拷贝是通过调用copy方法实现。

copymutableCopy方法

以下代码发生崩溃,为什么?

@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中不管是集合类对象(如:NSArrayNSMutableArrayNSSet…)还是非集合类对象(如:NSString…)接收到copymutableCopy消息时遵循以下原则:

  • 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 中并不是所有的对象都支持copymutableCopy,遵守 NSCopying协议的类可以发送 copy消息,遵守NSMutableCopying 协议的类才可以发送 mutableCopy消息。
假如发送了一个没有遵守上诉两协议而发送 copy或者 mutableCopy, 那么就会发生异常。但是默认情况下iOS中的类并没有遵守上述两个协议。

如果想使用copy那么就必须遵守NSCopying, 并且实现 copyWithZone:方法,如果想使用mutableCopy那么就必须遵守 NSMutableCopying, 并且实现 mutableCopyWithZone:方法。

ios – 在NSMutableArray中删除NSMutableDictionary内部

ios – 在NSMutableArray中删除NSMutableDictionary内部

我一直在寻找一段时间如何删除nil,null,值在这里和谷歌尝试所有我所看到的但我总是有一个例外,说选择器不兼容.
这是我的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进行排序

ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序

我有一个NSArray,其中包含一些Nsstring对象.例如:
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;
}];

解决方法

创建包含对超集数组的引用的NSComparator,并通过比较在两个字符串上调用[superset indexOfObject:str]的结果来确定字符串的相对顺序.调用sortedArrayUsingComparator:传递NSComparator的实例以获得所需的顺序.

今天关于iphone – 如何通过NSString长度对NSMutableArray进行排序?ios nsarray nsset的讲解已经结束,谢谢您的阅读,如果想了解更多关于cocoa – 使用NSMutableDictionary与NSMutableArray>发生的性能损失、copy修饰NSArray strong修饰NSMutableArray、ios – 在NSMutableArray中删除NSMutableDictionary内部、ios – 基于一组超级有序字符串对NSStrings的NSArray进行排序的相关知识,请在本站搜索。

本文标签: