18

ビューコントローラをスタックにプッシュしてからポップオフすると、次のエラーが発生します。

*** -[CALayer retainCount]: message sent to deallocated instance <memory address>

deallocポップオフされているViewControllerで呼び出された直後に発生し、このViewControllerのみに排他的であるようです。私はCALayerを使用していないので、CALayerはビュー自体と関係があると確信しています。

何か案は?

編集:これがバックトレースです

(gdb) bt
#0  0x01fcd3a7 in ___forwarding___ ()
#1  0x01fa96c2 in __forwarding_prep_0___ ()
#2  0x01fc10e8 in CFGetRetainCount ()
#3  0x01cbc770 in CA::release_root_if_unused ()
#4  0x01cbc707 in x_hash_table_remove_if ()
#5  0x01cbc4ec in CA::Transaction::commit ()
#6  0x01cc4838 in CA::Transaction::observer_callback ()
#7  0x01fa5252 in __CFRunLoopDoObservers ()
#8  0x01fa465f in CFRunLoopRunSpecific ()
#9  0x01fa3c48 in CFRunLoopRunInMode ()
#10 0x027dd615 in GSEventRunModal ()
#11 0x027dd6da in GSEventRun ()
#12 0x0057cfaf in UIApplicationMain ()
#13 0x00002dec in main (argc=1, argv=0xbfffeed0) 
4

7 に答える 7

12

同様の問題がありました。UIButton を適切に保持していなかったことがわかりました。原因の特定方法: - ゾンビを有効にする - 'Allocations' 計測器でプロジェクトを実行する - アプリを使用してバグをトリガーする - 計測器がタイムラインにメッセージ 'Zombie Messaged' を表示することを確認する - CALayer の詳細を開くリンクがあるはずです:それが割り当てられ、割り当てが解除されたとき - あなたは割り当てられた場所に興味があります。コードに配置する

幸運を!

于 2010-09-28T21:30:01.710 に答える
7

これは少しトリッキーです。私は、行スタイルとして tableview に持っていたクラス (m/xib) のいずれかの dealloc 関数での二重解放でした。計測器はオブジェクトについてあまり示しませんでしたが、コールスタックをチェックすると、-1 になるクラスを特定するのに非常に役立ちました。

サンプル

于 2011-03-02T17:32:27.290 に答える
4

同様の問題がありました。私の問題は、インターフェイスで宣言されたオブジェクト変数の 1 つが、本来あるべきだった としてでは(nonatomic, assign)なく、間違って with で宣言されていたことです。(nonatomic, retain)これにより、すでに保持カウントが 0 (= クラッシュ) のオブジェクトに解放メッセージが送信されました。

于 2010-11-16T14:38:14.233 に答える
3

同じエラーが発生しました。これは、 (eg )を使用してUIButtonを作成し、後でリリースしたためです。すでに含まれているので、これは間違っていました。だから私は自分を削除し、エラーはなくなりました。buttonWithType[UIButton buttonWithType:UIButtonTypeRoundedRect]buttonWithTypeautoreleaserelease

于 2011-05-03T22:45:54.403 に答える
1

どのビューが本当に役立つかを追跡する!フレームと、そのビューに関連するスーパーレイヤーとサブレイヤーがわかっている場合は、非常に簡単です。すべてのレイヤーをログに記録する場合は、同じメモリアドレスを検索して見つけるだけです。幸運を!:)

このカテゴリをアプリケーションに追加します

カテゴリ-ヘッダー:

#import "CALayer+debug.h"

@interface CALayer (Debug)

-(NSString*)debugDescription;
-(NSString*)debugLayerTree;

@end

カテゴリ-実装:

#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#import "CALayer+debug.h"
#import <UIKit/UIKit.h>
#import <objc/runtime.h> 
#import <objc/message.h>


@implementation CALayer (Debug)

//....

void Swizzle(Class c, SEL orig, SEL new)
{
    Method origMethod = class_getInstanceMethod(c, orig);
    Method newMethod = class_getInstanceMethod(c, new);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    else
        method_exchangeImplementations(origMethod, newMethod);
}

+ (void)swizzle {
    Swizzle([self class], @selector(init), @selector(newInit));
}

- (id)newInit {
    self = [self newInit];

    [self performSelector:@selector(log) withObject:self afterDelay:0.5];

    return self; // calls old method
} 

- (void)log { 
    NSLog(@"%@", [self debugDescription]);
}

- (NSString *)debugDescription {
    return [NSString stringWithFormat:@"%@ frame=%@ zAnchor=%1.1f, superlayer: %@>", [self description], NSStringFromCGRect(self.frame), self.zPosition, self.superlayer];
}


@end

例えばappdelegateからの呼び出し

[CALayer swizzle];
于 2011-11-28T13:29:20.560 に答える
0

同じエラーが発生していました。2 つのボタンを保持するオブジェクトを作成しUIView、それをナビゲーション アイテムの に追加しましたrightBarButtonItembuttonWithType問題は、ボタンを作成するためにファクトリ メソッドを使用したことですがallocinitWithFrame私は自分のビューだけです。次に、ビューを使い終わった後、それを解放し、その後、システムが2つのボタン(すでに解放されたのサブビューUIView)を解放しようとしたときに、クラッシュしました-すでに解放されたボタンにメッセージを送信していました。誰かが同様の種類のトラブルで時間を節約するのに役立つことを願っています.

于 2011-11-07T11:45:02.243 に答える
0

自動リリースプールに関係しているというこっそりの疑いがあります...

于 2010-03-04T12:24:10.810 に答える