Objective Cの/ iPhone:それはNSArrayのを再初期化することは可能ですか?
-
20-09-2019 - |
質問
私は非可変データ型が作成され、一度に変更できないことを読みました。(例えばNSStringのかにNSArray)。
しかし、彼らはオブジェクトの異なるセットを指すように再初期化することができますか?
その場合は、、私は使用の間で初めてのラウンドからの任意のallocを解放するためにリリースを使用していますか?例えばます:
myarrayの界面にNSArrayの* MyArrayというとして宣言、およびなどの非アトミック/次のように文字列の配列を指すように初期化コードでproperty.myArrayセットを保持します。
self.myArray = [myString componentsSeparatedByString:@","];
しかし、その後、私は、文字列の異なるセットを指すようにmyarrayの再初期化したい
self.myArray = [myOtherString componentsSeparatedByString:@","];
それは可能ですか?おかげで...
解決
はい、あなたはNSArrayのを再初期化することができます。ここで私はNSArrayの再初期化するために使用するサンプルコードです。
NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;
keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
他のヒント
それは本当にあなたがの再初期化のと何を意味するかによって決まります。ポインタが一定ではないので、あなたはポインタに別のの不変オブジェクト、を割り当てることができます。
例:
@interface MyObj : NSObject {
NSString *name; // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name; // sane people use copy instead of retain
// whenever possible. Using retain can
// lead to some hard to find errors.
@end
/* ... another file ... */
MyObj *theObject = [[[MyObj alloc] init] autorelease];
theObject.name = @"Peter";
NSString *oldName = theObject.name;
NSLog(@"%@", theObject.name); // -> Peter
NSLog(@"%@", oldName); // -> Peter
theObject.name = @"Martin";
NSLog(@"%@", theObject.name) // -> Martin
NSLog(@"%@", oldName) // -> Peter
上記の動作は、あなたが望むものである場合は、、それは大丈夫です。
を使用すると、最後の行を返すようにすることをしたい場合は、のマーティンのあなたが困っている。のものは定数文字列であり、のないの修正されることを意図されています。あなたは、あなたが本当にしたい場合は、直接オブジェクトのメモリを変更できましたが、が、これは危険です。のとではないことを推奨します。あなたがそのような行動が必要な場合は、変更可能なオブジェクトを使用します。
彼らができるもちろん。 NSArray
は不変であるということは、そのタイプのクラスの属性を変更することができないという意味ではありません。あなたは、内容を変更することはできませんが、それに新しいコンテンツを割り当てることができます。
あなたはconst
キーワードを使用する必要があります。