Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过属性在数组中查找特定实例_Objective C_Cocoa Touch_Nsarray - Fatal编程技术网

Objective c 通过属性在数组中查找特定实例

Objective c 通过属性在数组中查找特定实例,objective-c,cocoa-touch,nsarray,Objective C,Cocoa Touch,Nsarray,我有一个数组,其中包含MyClass的各种实例,它有四个属性:int-id、int-valueA、int-valueB和int-valueC。有时,我需要修改特定实例的属性(在本例中,假设它的id等于5) 目前我是这样做的: MyClass *myClass = [[MyClass alloc] init]; for (int i = 0; i < [myMutableArray count]; i++) { myClass = [myMutableArray objectAtI

我有一个数组,其中包含
MyClass
的各种实例,它有四个属性:
int-id
int-valueA
int-valueB
int-valueC
。有时,我需要修改特定实例的属性(在本例中,假设它的
id
等于
5

目前我是这样做的:

MyClass *myClass = [[MyClass alloc] init];

for (int i = 0; i < [myMutableArray count]; i++)
{
    myClass = [myMutableArray objectAtIndex:i];

    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
        [myMutableArray replaceObjectAtIndex:i withObject: myClass];
    }
}
for (MyClass *iteratorObject in myMutableArray) {
    if (iteratorObject.id == 5) {
        //do what you want with that specific object
        //insert your modified object back into mutable array
    }
MyClass*MyClass=[[MyClass alloc]init];
对于(int i=0;i<[myMutableArray count];i++)
{
myClass=[myMutableArray对象索引:i];
如果(myClass.id==5)
{
myClass.valueA=100;
myClass.valueB=200;
myClass.valueC=300;
[myMutableArray replaceObjectAtIndex:i with Object:myClass];
}
}

是否有更好的方法(我不太确定是否更有效)来实现这一点?

在开始过度优化之前,您确定这是一个性能瓶颈吗


另一种方法是将实例保存在
NSMutableDictionary
中,其中键是
id
NSNumber
。然后,当您需要更新特定的实例时,只需使用
[myMutableDictionary objectForKey:@(someIntId)]
直接检索实例即可。这将使您的O(n)循环变成O(1)哈希表查找[假设一个良好的
哈希
实现,或者在最坏的情况下是O(logn)]。

在开始过度优化之前,您确定这是一个性能瓶颈吗


另一种方法是将实例保存在
NSMutableDictionary
中,其中键是
id
NSNumber
。然后,当您需要更新特定的实例时,只需使用
[myMutableDictionary objectForKey:@(someIntId)]
直接检索实例即可。这将使你的O(n)循环变成一个O(1)哈希表查找[假设一个好的
哈希实现,或者在最坏的情况下是O(logn)]。

如果你知道只有一个实例的
id
为5,只需添加一个
中断if
语句末尾的code>。这将终止循环迭代,可能是最有效的

在没有评测的情况下,您不应该过分担心运行时性能

要编写更少的代码,可以将
编写为:

for (MyClass *myClass in myMutableArray) {
如果您仍然需要经常访问单个项目,您可能希望放弃使用阵列存储

另外,不要做:

MyClass *myClass = [[MyClass alloc] init];

因为您不必要地创建了一个从未使用过的实例,只是被扔掉了。

如果您知道只有一个实例的
id
为5,只需添加一个
中断if
语句末尾的code>。这将终止循环迭代,可能是最有效的

在没有评测的情况下,您不应该过分担心运行时性能

要编写更少的代码,可以将
编写为:

for (MyClass *myClass in myMutableArray) {
如果您仍然需要经常访问单个项目,您可能希望放弃使用阵列存储

另外,不要做:

MyClass *myClass = [[MyClass alloc] init];

因为您不必要地创建了一个从未使用过的实例,只是被扔掉了。

我看到了两种快速优化代码的方法。首先,您不需要原始分配新对象来替换数组中的myClass实例,因为它是指针,实际上您是在直接操作数组中的对象。其次,如果您要使用递增器保留当前for循环,那么MyClass的原始分配是不必要的。您不需要对它执行alloc和init,因为您只需要一个指针。但是,您可以使用for-in循环而不是递增的for循环,直接通过数组进行循环

最终代码:

for (MyClass *myClass in myMutableArray)
{
    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
    }
}

我看到了两种快速优化代码的方法。首先,您不需要原始分配新对象来替换数组中的myClass实例,因为它是指针,实际上您是在直接操作数组中的对象。其次,如果您要使用递增器保留当前for循环,那么MyClass的原始分配是不必要的。您不需要对它执行alloc和init,因为您只需要一个指针。但是,您可以使用for-in循环而不是递增的for循环,直接通过数组进行循环

最终代码:

for (MyClass *myClass in myMutableArray)
{
    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
    }
}

通过任何标准获取数组特定成员的一种简单但冗长的方法是使用
indexOfObjectPassingTest:
objectAtIndex:

MyClass * theInstanceIWant;
theInstanceIWant = [myArray objectAtIndex:[dates indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
                                                        return ([obj id] == 5);
                    }];

theInstanceIWant.valueA = 100;
theInstanceIWant.valueB = 200;
theInstanceIWant.valueC = 300;
无需使用
replaceObjectAtIndex:withObject:
——名称
安装工具
引用数组中的实际对象,您可以在其仍在数组中时更改其属性


(这通过
NSArray
上的分类方法变得更令人愉快)


通过任何标准获取数组特定成员的一种简单但冗长的方法是使用
indexOfObjectPassingTest:
objectAtIndex:

MyClass * theInstanceIWant;
theInstanceIWant = [myArray objectAtIndex:[dates indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
                                                        return ([obj id] == 5);
                    }];

theInstanceIWant.valueA = 100;
theInstanceIWant.valueB = 200;
theInstanceIWant.valueC = 300;
无需使用
replaceObjectAtIndex:withObject:
——名称
安装工具
引用数组中的实际对象,您可以在其仍在数组中时更改其属性


(这通过
NSArray
上的分类方法变得更令人愉快)


首先,您永远不想在Objective-C中命名变量
id
id
表示指向任何类型的指针,它是一个保留关键字

一种更好/更有效的方法称为快速枚举。快速枚举是遍历列表/数组/集合中每个项的一种特殊方法。代码如下所示:

MyClass *myClass = [[MyClass alloc] init];

for (int i = 0; i < [myMutableArray count]; i++)
{
    myClass = [myMutableArray objectAtIndex:i];

    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
        [myMutableArray replaceObjectAtIndex:i withObject: myClass];
    }
}
for (MyClass *iteratorObject in myMutableArray) {
    if (iteratorObject.id == 5) {
        //do what you want with that specific object
        //insert your modified object back into mutable array
    }
虽然这是最简单的方法,但你违反了一条规则。你永远都不应该迟到