1

私のクラスではFoo

[...]
- (void)dealloc
{
    NSLog(@"Foo is being dealloced!");
    [_property1 release];
    [_property2 release];
    [super dealloc];
}
[...]

私は乗り-[Foo class]: message sent to deallocated instanceます[super dealloc]

Fooから継承しNSObjectます。私はまだARCを使用していません。ARCに進む前に、これを実行する必要があります。

それを引き起こす可能性のあるアイデアはありますか?

4

3 に答える 3

4

同じ問題が発生し、ゾンビオブジェクトを非アクティブ化したときに解決しました。しかし、なぜそれが役に立ったのかについての技術的な説明はまったくありません。

于 2012-11-29T09:29:07.110 に答える
1

オブジェクトが正しく割り当て解除された後にメソッドを呼び出すのはデバッガーでありclass、おそらくデバッガーの変数セクションに詳細を表示します。ゾンビが有効になっていて、ブレークポイントが設定されているXcode 4.4.1の次のコードは、メッセージをトリガーするのに十分です。

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

これはXcode4.6では問題ではありません。

ここでより長い答えを参照してくださいhttps://stackoverflow.com/a/14734241/1347502

于 2013-02-06T16:56:48.353 に答える
0

コードをもっと投稿できますか?私は次のことを試しました:

//  Foo.h

#import <Foundation/Foundation.h>

@interface Foo : NSObject

@property (nonatomic, strong) NSString *property1;
@property (nonatomic, strong) NSString *property2;

@end

//  Foo.m

#import "Foo.h"

@implementation Foo

- (id)init
{
    self = [super init];

    if (self)
    {
        _property1 = nil;
        _property2 = nil;
    }

    return self;
}

- (void)dealloc
{
    NSLog(@"%s Foo is being dealloced!", __FUNCTION__);
    [_property1 release];
    [_property2 release];
    [super dealloc];
}

@end

また、View Controllerから使用すると、チャンピオンのように機能します。例:

//  ViewController.m

#import "ViewController.h"
#import "Foo.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    Foo *foo = [[Foo alloc] init];

    foo.property1 = [NSString stringWithFormat:@"My name is %@", @"Rob"];
    foo.property2 = [NSString stringWithFormat:@"My age is %d", 29];

    [foo release];
}

@end

このテストはXcode4.5.1で行いました。たぶんあなたは(a)これがあなたのために働くことを確認することができます。(b)上記のコードとコードの違いを確認して、問題の原因を診断します。

明らかなことは、問題の原因はの定義でFooはなく、おそらく他のクラスがFooオブジェクトを作成して最終的に解放する方法の結果であるということです。どこかで電話をかけているdealloc、またははるかに可能性が高いのは、リリースしすぎていることです(対応するallocまたはがないリリースretain)。

ちなみに、静的アナライザーを使用してコードを実行することをお勧めします([製品]メニューの[分析]を選択するか、shift+ command+を押しますB)。アナライザーによって警告が生成されることはありません。静的アナライザは、非ARCコードを悩ませがちなあらゆる種類の基本的なメモリ管理の問題を見つけるのに優れています。

于 2012-10-22T19:37:50.577 に答える