2

私はデータオブジェクトクラスを持っています:

@interface Item: NSObject {
    NSString *title;
    NSString *text;
}

@property (copy) NSString *title;
@property (copy) NSString *text;

@end

@implementation Item

@synthesize text;

- (void)updateText {
    self.text=@"new text";
}

- (NSString *)title {
    return title;
}

- (void)setTitle:(NSString *)aString {
    [title release];
    title = [aString copy];
}

@end

title合成されていないメソッドを使用する場合はプロパティを問題なく設定できますが、合成されたアクセサーを使用してプロパティを設定するとupdateText、次の行のメソッドでエラーが発生します。

self.text=@"new text";

エラーは次のとおりです。

*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement doesNotRecognizeSelector: -- abort

同一の合成されていないアクセサーが機能し、合成されたアクセサーが機能しないのはなぜですか?

オブジェクトはメイン スレッドで作成され、NSOperation スレッドからアクセスするとエラーが発生します。

4

3 に答える 3

3

セッターは次のようにコーディングする必要があります。

[title autorelease]
title = [aString copy];

そうしないと、別のスレッドがその足元で解放されたタイトル オブジェクトを取得する可能性があります。

または、Cocoa のメモリ管理プログラミング ガイドから他の一貫したアクセサー スタイルを選択します。

于 2009-07-11T09:48:51.907 に答える
0

このコードでは、コピーする前に[self setTitle:[self title]]リリースしてロックを解除しtitleます。title == aStringセッターにあるかどうかを確認する必要があります。

于 2009-07-11T18:57:51.403 に答える
0

あなたが投稿したコードは、私にとってはうまく機能します。このコードと実際に使用しているコードに違いはありますか?

表示されているエラー メッセージは、既にリリースされているオブジェクトへのポインターである "ゾンビ" を参照しています。このコードには、そのような動作のリスクを示すものは何もないため、実際のエラーは別の場所にあると思います。

考えられる解決策の 1 つは、Xcode のデバッガーを使用してNSStringオブジェクトのアドレスを確認し、その情報を使用して最終的にNSInvocation警告が発生するものを判断することです。

于 2009-07-11T05:48:33.467 に答える