私は現在、以下が機能する場合と機能しない場合がある理由について混乱しています。次のコードを使用する場合:
NSString *currentLoc = [[NSString stringWithString:sceneName] retain];
self.currentLocation = currentLoc;
[currentLoc release];
NSString *currentLocation, of type (nonatomic, retain)
これにより、myが新しい値で上書きされます。次の手順を実行しても、この値にアクセスできないのはなぜですか。
NSString *test = currentLocation;
デバッグすると、テストがランダム配列に設定されていることがわかります。そのため、ポインターは完全に異なるものを指している必要があります。コードを確認しましたが、currentLocation変数はここでのみ設定されています。私が以下を使用する場合:
NSString *test = self.currentLocation;
次に、正しい値が表示されます。currentLocation/ self.currentLocationが異なるオブジェクトとして扱われる理由を誰かが説明できますか?私はその自己を理解しています。アクセサーを使用しますが、正しく設定されていれば、両方とも同じ値を指す必要がありますか?
編集1:(すべてのコード)
.h
NSString *currentLocation;
@property (nonatomic, retain) NSString *currentLocation;
.m
@synthesize currentLocation;
NSString *currentLoc = [[NSString stringWithString:sceneName] retain];
self.currentLocation = currentLoc;
[currentLoc release];
if (currentLocation != nil && singleton.storyLocation != nil)
{
if (boolMoviePlayed == false && [singleton.storyLocation isEqualToString:currentLocation]) // crash here due to current location being set to an array
[buttonPlayMovie setHidden:!textVisible];
}
self.currentLocation = nil; // viewDidUnload
[currentLocation release]; // dealloc
編集2:(更新されたコード、まだクラッシュします)
そのため、今回は、以下に示すように、設定された方法でコードにアクセスしようとしました。
if (self.currentLocation != nil && singleton.storyLocation != nil)
{
if (boolMoviePlayed == false && [singleton.storyLocation isEqualToString:self.currentLocation])
[buttonPlayMovie setHidden:!textVisible];
}
ただし、今回は、このプロセス中のどの時点でも変数が変更されていないにもかかわらず、変数が設定されていないように見えるクラッシュが発生します(編集1のコードを参照)。
編集3:
今、私は混乱している、私は私が答えを持っていると思ったが、私はただそうは思わない。Ericsの提案を使用してみました:
@synthesize currentLocation = _currentLocation;
次に、currentLocationへのすべてのアクセスがself.currentLocation=xyzを使用して設定されていることを確認しました。今、deallocメソッドに関しては、私は常に自分自身を使用しないように警告されていました。取引所で。しかし、これは、currentLocationが設定されていないため、すべての値がnilであることを意味します。[self.currentLocation release]を使用しても安全ですか、それとも問題を解決するにはどうすればよいですか?
編集4:
私の知る限り、dealloc内で[_currentLocation release]を使用します。間違っている場合は修正してください。そうでない場合は、機能しているように見えるので、今のところこのルートをたどります。