1

変更不可能なデータ型は、一度作成すると変更できないことを読みました(例: NSString または NSArray)。

しかし、オブジェクトの別のセットを指すように再初期化できますか?

もしそうなら、リリースを使用して、使用と使用の間に最初のラウンドから割り当てを解放しますか? 例えば:

myArray はインターフェイスで NSArray *myArray として宣言され、次のように初期化コードで文字列の配列を指すように設定された非アトミック/保持プロパティ.myArray として宣言されます。

self.myArray = [myString componentsSeparatedByString:@","];

しかし後で、別の文字列セットを指すように myArray を再初期化したい

self.myArray = [myOtherString componentsSeparatedByString:@","];

出来ますか?ありがとう...

4

3 に答える 3

2

re-initialize の意味によって異なります。ポインターは定数ではないため、別の不変オブジェクトをポインターに割り当てることができます。

例:

@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

上記の動作が必要な場合は、問題ありません。

最後の行でMartinを返すようにしたい場合は、問題が発生します。これらは定数文字列であり、変更することを意図していません。本当に必要な場合は、オブジェクトのメモリを直接変更することもできますが、これは危険であり、お勧めできません。そのような動作が必要な場合は、変更可能なオブジェクトを使用してください。

于 2010-01-12T07:29:06.590 に答える
0

もちろんできます。が不変であると言っても、NSArrayそのタイプのクラスの属性を変更できないという意味ではありません。コンテンツを変更することはできませんが、新しいコンテンツを割り当てることはできます。

参照の変更も不可能にしたい場合は、constキーワードを使用する必要があります。

于 2010-01-12T06:58:01.193 に答える
0

はい、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]);
于 2010-01-12T07:13:24.833 に答える