6

ゾンビを有効にして xcode 4.5.1 (LLDB) デバッガーで ARC を使用しないアプリケーションを実行すると、-[super dealloc] (-[NSObject dealloc]) を呼び出すと、このエラーが 2 回発生します (2)。

* -[V2APIClient クラス]: 割り当て解除されたインスタンス 0x9d865c0 に送信されたメッセージ * -[V2APIClient クラス]: 割り当て解除されたインスタンス 0x9d865c0 に送信されたメッセージ

xcode 4.4.1 (LLDB) デバッガーで同じアプリケーションを実行すると、エラー メッセージが 1 回表示されます (1)。XCode 4.3.2 で同じアプリケーションの少し前のバージョンを実行すると、エラー メッセージがまったく表示されません (0)。同じ/最新のコードでこれを再試行します。

参考までに-これは、まだ回答されていないこの他の投稿とまったく同じ問題のようです: -[Foo class]: message sent to deallocated instance on [super dealloc] )

同じ質問を 2 回再投稿しないようにしましたが、続行するように勧められました: https://meta.stackexchange.com/questions/152226/avoiding-asking-a-question-thats-already-been-asked

また、Apple Developer Forums で同等の質問をしました: https://devforums.apple.com/thread/171282

最後に、これが私のクラスの本質です。

@interface ASIHTTPRequestHandler : NSObject {
  id _error;
}
@property (nonatomic,retain) id error;
@end

@implementation ASIHTTPRequestHandler
@synthesize error = _error;
-(id)init
{
    self = [super init];
    if (self)
    {
        self.error = nil;
    }
    return self;
 }

 -(void)dealloc
 {
     self.error = nil;
     [super dealloc];// this is the line that appears to cause the problems
  }
  @end

この問題の解決を手伝ってください。メモリ管理規則に違反しているとは思いませんが、このエラーはそうでないことを暗示しているようです。この問題を解決できるまで、新しいコードをチェックインするのをためらっています。

ありがとう、チャック

ps記録のために、呼び出しコードは次のとおりです。

PanoTourMgrAppDelegate *ptmAppDlgt = [PanoTourMgrAppDelegate getApplicationDelegate];
Settings *settings = ptmAppDlgt.settings;
Identification *identification = ptmAppDlgt.identification;
V2APIClient *v2ApiClient = [[V2APIClient alloc] initWithSettings:settings identification:identification];
NSDictionary *result = [v2ApiClient get_application_status];
BOOL success = [v2ApiClient callWasSuccessful:result];
if (!success)
{
    id error = v2ApiClient.error;
    NSString *mbTitle = nil;
    NSString *mbMessage=nil;
    if ([error isKindOfClass:[NSString class]])
    {
        mbTitle = @"Application version no longer suppported";
        mbMessage = (NSString*)error;
        [MessageBox showWithTitle:mbTitle message:mbMessage];
    }
}
[v2ApiClient release]; // This is the line that indirectly causes the messages above
4

2 に答える 2

3

割り当てが解除されたインスタンスにメッセージを送信している場合は、メモリを正しく管理していないことが原因です。保持によってバランスが取れていないリリースがあります。オーバーリリース。

まず、コードに対して「ビルドと分析」を行います。識別された問題を修正します。

次に、ゾンビ検出を有効にして Instruments で実行し、参照カウント追跡機能をオンにします。次に、クラッシュしたときに、問題のオブジェクトに対するすべての保持/解放イベントを調べます。追加のリリースが見つかります。課題は、リテーニングを適切な場所に突き刺してリリースのバランスを取ることです。

(そして、Rob が正しく指摘しているように、それは単純に release への余分な呼び出しのケースかもしれません。)

于 2012-10-22T19:38:10.377 に答える
1

これは、Xcode の一部のバージョンのデバッガーのバグです。

私はXcode 4.4.1でそれを持っていましたが、Xcode 4.6にはありません。バグを実行するために、新しい「Single View Application」プロジェクトを作成し、スキーム ダイアログで「Enable Zombie Objects」をオンにして、View Controller で次のコードを実行し、最終行にブレーク ポイントを設定しました。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSObject *object = [[NSObject alloc] init];
    [object release];

}

これにより、デバッガーに次のメッセージが表示されます。

-[NSObject クラス]: 割り当て解除されたインスタンス 0x6a7e330 に送信されたメッセージ

また、デバッガーの変数セクションでオブジェクトがそのクラスを として記述していることも確認できます_NSZombie_。ブレークポイントを削除すると、メッセージは表示されなくなります。メソッドの呼び出しはclass、オブジェクトが正しく割り当て解除された後、デバッガーによって行われます。

于 2013-02-06T16:41:09.407 に答える