0

私は現在、以下が機能する場合と機能しない場合がある理由について混乱しています。次のコードを使用する場合:

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]を使用します。間違っている場合は修正してください。そうでない場合は、機能しているように見えるので、今のところこのルートをたどります。

4

5 に答える 5

3

私はあなたがどのように合成したか、そしてあなたのivarsを見ていきます。実際には、currentLocationはiVarを直接参照していますが、self.currentLocationは、次のように合成した場合、別の変数を指している可能性があります。

@synthesize myVar = _myVar

そして、あなたはあなたのインターフェースにもありました

interface {
  myVar
}

このシナリオでは、説明されている問題が表示されます。

于 2012-07-19T13:49:57.487 に答える
1

currentLocationは変数でself.currentLocationあり、プロパティゲッター(メソッド)を呼び出すための優れた方法- (NSString*)currentLocationです。

明らかに、値を格納するためにプロパティを使用しており、変数とプロパティの間に接続が設定されていません。

プロパティを合成している行を検査する必要がありますcurrentLocation

edit3への回答:

プロパティivarに直接アクセスする必要があるのは、メソッドandだけですinitdeallocあなたはdealloc通常直接書く[_currentLocation release]。しかし、それについては大きな議論があります。self.currentLocation = nil一般的に、ただ入れるのは正しいdeallocですが、あなたは自分が何をしているのかを知る必要があります。

于 2012-07-19T13:51:06.417 に答える
0

を使用し@synthesize currentLocation = _currentLocationます。

于 2012-07-19T13:50:06.847 に答える
0

簡単にするには:

プロパティ=ゲッター+セッター+アイバー

Exp。#1:

.h

NSString *yourName;  //iver
@property (nonatomic, retain) NSString *myName; //property

.m

@synthesize myName;   

-(void)someMethod{
    self.myName = @"Mike";

    NSString * name = self.myName; // name will be "Mike"
    name = myName; // name will be "Mike"

    name = yourName;   // name will be null
}

ここでyourName、self.myName、そして3つの異なるものがあります:

yourNameはiverself.myNameは2つの異なる場合のゲッターまたはセッターですmyNameはiverです

次に、yourNameiverをmyNameプロパティに接続します。Expでその方法を見てみましょう。#2

Exp。#2

.m

@synthesize myName = yourName;   

-(void)someMethod{
   self.myName = @"Mike";

    NSString * name = self.myName; // name will be "Mike"

    name = yourName;   // name will be "Mike"

    yourName = @"James";

   name = self.myName ; // name will be "James"

}

ここでは、myNameiverを使用できません。

于 2012-07-19T17:13:27.370 に答える
0

表示したコードに問題はありません。しかし、あなたはコードの断片を示しており(完全なメソッドやクラスさえありません)、何が起こっているのかを知るのは本当に難しいです。エラーは他の何かによるものである必要があります。変数名の変更に関するこの話はすべて完全に無関係です。同じ変数名を使用しても問題はありません。

于 2012-07-21T03:03:29.923 に答える