2012-02-29 11 views
0

次のコードを使用しました。ゾンビレポート:メッセージが割り当て解除されたインスタンスに送信されました

MainView.h:

NSString *sCopySource; 
NSString *sFileSource; 

// retain and copy used both for test proposes 
@property (nonatomic, retain) NSString *sCopySource; 
@property (nonatomic, copy) NSString *sFileSource; 

MainView.m:

// Inside the first method: 
sCopySource = [NSString stringWithFormat:@"%@%@", path1, filename]; 
sFileSource = [NSString stringWithFormat:@"%@%@", path2, filename]; 

// Inside the second method: 
[[NSFileManager defaultManager] copyItemAtPath:sCopySource toPath:sFileSource error:&err]; 

そしてゾンビが有効なオブジェクトsCopySourcesFileSourceことで、コードの最後の行でエラーを取る:

message sent to deallocated instance 

なぜですか? retainおよびcopyとしてマークされた特性。これを修正するには?

ありがとうございました!

P.S. ratainreleaseの方法を使用して回答しないでください。彼らは非常に不便です。

答えて

2

プロパティを定義しましたが、インスタンス変数に直接書き込んでいます。

あなたはプロパティで保持/解放ロジックを使用したい場合は、あなたが使用する必要があります。

self.sCopySource = [NSString stringWithFormat:@"%@%@", path1, filename]; 
    self.sFileSource = [NSString stringWithFormat:@"%@%@", path2, filename]; 

その方法は、コピーを行うと、保持方法が使用されています。

+0

gaige、ありがとうございます!ベストは何ですか?保持するかコピーしますか? – Dmitry

+0

何をしているかによって異なります。コピーは、保持しているバージョンが変更されないことを保証します。一方、Retainは元のオブジェクトへの参照を保持します。元のオブジェクトが元のクラスに変更可能な場合は変更される可能性があります。通常、retainは十分で効率的ですが、コードの他の場所で変更される可能性のある値を扱う場合は、コピーが必要な場合があります。 – gaige

+0

もう一度ありがとう! – Dmitry

関連する問題