1

XCode 4.6 で上記のメッセージが表示されます。かなり徹底的な検索を行いましたが、問題を取り巻く正確な状況と一致するものはないようです。確かに、私は iOS 開発に比較的慣れていないため、メモリ管理は私の得意分野ではありませんでしたが、これには完全に腹を立てました。

次のようtheLinkにクラスで定義されているインスタンス変数があります。Game

@interface Game : NSObject

// Class objects
@property(nonatomic,retain) NSMutableArray *queryItems;
@property(nonatomic,retain) NSMutableArray *theArray;
@property(nonatomic,retain) NSString *theLink;
@property(nonatomic,retain) NSString *thePath;

theLink私のView ControllermakeGameのメソッドで呼び出されるメソッドに設定されています:initialiseGame

- (void) initialiseGame
{
    bool gameCreated = FALSE;
    while (!gameCreated)
    {
        gameCreated = [theGame makeGame:@"ptl"];
    }
    [loadingIndicator stopAnimating];
    [loading setText:@"Tap to Start"];
    [self performSelector:@selector(setLabels) withObject:nil afterDelay:0.0];
}

(注: performSelector afterDelay は、続行する前にビューを更新できるようにするために使用されます。ちょっとしたハックですが、より良い方法を見つけることができませんでした!)

次に、アプリはゲームをロードし、ユーザーが画面をタップして開始すると、View Controller から次のメソッドが呼び出されます。

- (void) setupLink
{
    ...
    for(int i=0; i<[theGame.theLink length]; i++) {
        ...
    }
}

これはtheGame.theLink、クラッシュが発生している場所への参照です。

私が最も混乱したのはtheGame.theLink、メソッド内から呼び出した場合、それが正しく表示され、クラスinitialiseGameから他の変数を呼び出しても(またはなど、完全に機能するため、object は完全に割り当て解除されておらず、 variable のみが割り当てられていることです。GamethePaththeArraytheGametheLink

ビューコントローラーが更新されているため、変数の割り当てがどこかで解除されているようです。変数を解放していないため、この変数のみが割り当て解除されている理由がわかりません。最初に言ったように、メモリ管理は私の強みではありません!

どんな助け/アイデアも大歓迎です。詳細が必要な場合はお知らせください。

ありがとう、アンドリュー

編集:theLink内の設定makeGame

- (bool) makeGame:(NSString*)gameType
{
    ...
    [self getLink];
}

- (void) getLink
{
    ...

    if (... && ((arc4random() % 10) > 8))
    {
        theLink = @"Animals";
    }
}

theLink乱数やその他の要因に応じて、さまざまな方法で設定できます。これは、単純に静的文字列に設定する最も基本的な形式です。がどのようtheLinkに設定されているか、何に設定されているかに関係なく、プログラムは常に同じ時点でクラッシュします。

4

2 に答える 2

0

従うべき非常に簡単なルールがあります。プロパティを宣言した場合は、プロパティを介してアクセスします。それ以外の場合 (上記のように を使用theLink = ...) は、プロパティ アクセサーに組み込まれているすべてのメモリ管理をバイパスします。

self.theLink = ...

MRCの下でこの問題を解決したでしょう。根本的な原因を理解していなくても、ARC に切り替えることで問題が「解決」されました。

于 2013-06-08T07:19:29.093 に答える