6

Objective-cの配列内のポインターに関連する問題に遭遇しました。

私がやろうとしているのは、NSArray内のポインターを取得し、それらをメソッドに渡してから、戻り値を元のポインター(配列に属するポインター)に戻すことです。

私がCとC++から知っていることに基づいて、配列内のポインターを逆参照することにより、それらが指す値を変更できるはずです...これが私が使用しているコードですが、機能していません(値の電話NSLog出力に基づいて変更されないことを指します)。

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"];
    for (NSString* phone in phoneNumbers) {
        (*phone) = (*[self removeNonNumbers:phone]);
        NSLog(@"phone:%@", phone);
    }

そして、NSString*を渡すメソッドシグネチャは次のとおりです。

- (NSString*) removeNonNumbers: (NSString*) string;

ご覧のとおり、phoneNumbers内の各NSString*を変数phoneで繰り返し処理しています。電話をremoveNonNumbers:に渡します。これにより、変更されたNSString*が返されます。次に、removeNonNumberから返されたポインターを逆参照し、値を電話に割り当てます。

お分かりのように、私はおそらくObjective-Cオブジェクトをあまりよく理解していません。これはC++またはCで機能すると確信していますが、なぜここで機能しないのかわかりません。よろしくお願いします!

4

5 に答える 5

13

ええ、それはうまくいきません。次のものが必要ですNSMutableArray

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy];
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) {
  NSString * phone = [phoneNumbers objectAtIndex:i];
  phone = [self removeNonNumbers:phone];
  [phoneNumbers replaceObjectAtIndex:i withObject:phone];
}
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"];
[phoneNumbers release];
于 2009-11-23T19:06:16.317 に答える
4

Objective-C オブジェクト変数を逆参照することはできません。これらは常にポインターですが、原子値であるかのように扱う必要があります。生成する新しいオブジェクトを含めるには、配列自体を変更する必要があります。

于 2009-11-23T19:09:01.677 に答える
2

NSArrayC /C++スタイルの配列ではありません。これはObjective-Cオブジェクトです。クラスの操作を実行するには、クラスのインスタンスメソッドを使用する必要があります。NSArray

Objective-Cでは、オブジェクトポインタを「逆参照」してその値を設定することはありません。

また、変更を許可しないFastEnumerationと呼ばれるものを使用しています。

于 2009-11-23T19:04:11.077 に答える
2

enumerateObjectsUsingBlock:も使用できます。

NSArray *array = [NSArray array];
__block NSMutableArray *mutableCopyArray = [array mutableCopy];
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]];
}];

チェックアウトNSArray を反復処理するにはどうすればよいですか?

于 2012-05-14T19:24:53.127 に答える
0

これはある程度は機能するかもしれませんが、私はまだテストしていません。NSArray やその他の多くの cocoa オブジェクトはかなり複雑で、クラス クラスター設計パターンの一部として内部でさまざまな実装を行うことができます。

そのため、最終的には、内部で何を扱っているのか本当にわかりません。NSArray は実際には不変になるように設計されているため、インプレース編集は二重に悪い考えです。

内部をいじることができるように設計されたオブジェクトは、 のような API メソッドを介してそれらを公開しNSMutableDataますmutableBytes

処理された値を使用して新しい NS(Mutable)Array を構築することをお勧めします。

于 2009-11-23T19:06:37.143 に答える