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 のみが割り当てられていることです。Game
thePath
theArray
theGame
theLink
ビューコントローラーが更新されているため、変数の割り当てがどこかで解除されているようです。変数を解放していないため、この変数のみが割り当て解除されている理由がわかりません。最初に言ったように、メモリ管理は私の強みではありません!
どんな助け/アイデアも大歓迎です。詳細が必要な場合はお知らせください。
ありがとう、アンドリュー
編集:theLink
内の設定makeGame
- (bool) makeGame:(NSString*)gameType
{
...
[self getLink];
}
- (void) getLink
{
...
if (... && ((arc4random() % 10) > 8))
{
theLink = @"Animals";
}
}
theLink
乱数やその他の要因に応じて、さまざまな方法で設定できます。これは、単純に静的文字列に設定する最も基本的な形式です。がどのようtheLink
に設定されているか、何に設定されているかに関係なく、プログラムは常に同じ時点でクラッシュします。