これが私のシナリオです-クラスのヘッダーファイルで私は次のことを行います:
@interface MyClass : NSObject
{
NSString *string1;
NSString *string2;
}
- (void) methodOne: (NSString *) passedString;
- (void) methodTwo: (NSString *) passedString;
@end
実装ファイルでこれを行います:
#import MyClass.h
@implementation MyClass
- (void) methodOne: (NSString *) passedString
{
NSLog(@"%@", passedString);
string1 = passedString;
}
- (void) methodTwo: (NSString *) passedString
{
NSLog(@"%@", passedString);
string2 = passedString;
}
私が見つけたのは、これを[NSString alloc] initWithString:]と比較すると、ある種の不整合があるということです。
ご覧のとおり、string1とstring2はまったく同じように扱われますが、string1は設定されていますが、string2は空のままです。後で参照すると、アクセスが悪くなります。
多分私は空の文字列をmethodTwoに渡していると思いました:それで私はそれが空ではないことを証明するNSLogを追加しましたが、期待される文字列を持っています。
これに変更する前に、この不整合に気付いたので、次のようにします。
- (void) methodOne: (NSString *) passedString
{
NSLog(@"%@", passedString);
string1 = passedString;
}
- (void) methodTwo: (NSString *) passedString
{
NSLog(@"%@", passedString);
string2 = [[NSString alloc] initWithString: passedString];
}
これで、両方の文字列が期待どおりに機能しています。私の質問は、なぜこの矛盾があるのかということです。
これが私に起こったのはこれだけではありません。それはあらゆる種類のオブジェクトで起こりました。毎回機能するように見えるのは、allocinitだけです。stringWithStringのようなメソッド:ほとんどの場合機能しますが、常に機能するとは限りません。