0

私は現在、iPhone 用の最初のアプリに取り組んでいます。ほぼ完了していますが、メモリ管理などに問題があります。私は Java が得意で、Objective C を学習してまだ 4 日しか経っていないことを覚えておいてください。

したがって、正確な問題はこの領域にあります (アスタリスクの行の間)。注: すべてのコードは、重要な場合は大きなゲーム ループ内にあります。

else 
        {
            ***********************************
            NSString *rand = [NSString stringWithFormat:@"%@", randNumberS];
            while(lastTime + interval >= currentTime)
            {
        !!!!!!!!!NSString *user = [NSString stringWithFormat:@"%@", userText]; 
                    if([user isEqualToString: rand])
                    {
            ***********************************
                        score += 10;
                        randNumberS = nil;
                        timeToGenerateNum = true;
                        bottomClear = true;
                        break;
                    }
                    else 
                    {

                        //NSLog(@"%@ != %@, %i", userText, randNumberS, score);
                    }

            }
            NSLog(@"Game Over! Your score was %i!", score);
        }
    }

ゾンビを有効にする前に実行するたびに(注:コードは数秒間実行されました)、Thread 6: Program received signal: "EXC_BAD_ACCESS"「!」でマークされた行に. ゾンビを有効にした後、数秒間実行された後、動作が停止-[CFString respondsToSelector:]: message sent to deallocated instance 0x11168440し、コンソールにメッセージが表示されます。また、「!」で同じ行にフラグを立てます。

これらの両方を調べましたが、どちらもメモリ管理が不十分であることを示しています。NSString オブジェクトを解放しようとしましたが、プログラムでオブジェクトを解放できません (注: このエラー メッセージが表示されます"release" is unavailable: not available in automatic reference counting mode)。

どんな助けでも大歓迎です、ありがとう!

編集:

userText はさまざまなメソッドで使用されますが、主にこのメソッドで使用されます。

-(IBAction)button1Clicked:(id)sender
{    
if(userText == nil)
{
    userText = [NSString stringWithFormat:@"%i", 1];
}
else 
{
    userText = [NSString stringWithFormat:@"%@%i",userText , 1];
}
bottomLabel.text = userText;
NSLog(@"Test 1");
}
4

4 に答える 4

1

Instruments の下のシミュレーターでアプリを実行します (Xcode の Product > Profile メニュー項目を使用)。ゾンビ楽器を選択します。ゾンビ参照が原因で Instruments がアプリを停止した場合、詳細パネル (Instruments ウィンドウの下部) をドリルダウンして、ゾンビ オブジェクトの保持と解放の履歴を見つけることができます。拡張詳細パネル (Instruments ウィンドウの右側) を開くと、各保持とリリースのスタック トレースを表示できます。

これは、ゾンビ オブジェクトが予想よりも早く解放される理由を追跡するのに役立ちます。

追加のガイダンスへのリンク:

http://www.markj.net/iphone-memory-debug-nszombie/

http://www.dimzzy.com/blog/2011/02/hunting-down-zombies-in-ios-apps/

于 2012-07-07T17:05:12.263 に答える
1

userText変数は有効なオブジェクトではありません。これは、エラー メッセージが示す内容です。一般に、EXC_BAD_ACCESS は、もう存在しないものを指すポインターを使用しようとすると発生します。次に、ゾンビを有効にすると、メッセージはさらに明確にuserTextなり、以前は文字列でしたが、割り当てが解除されました。

編集:

userText がインスタンス変数の場合は、プロパティを使用してからドット表記を使用することをお勧めします。userText が宣言されている @interface セクションがどこかにあります。次のようになります。

@property (nonatomic, strong) NSString *userText;

次に @implementaiton エリアで、次のようにします。

@synthesize userText = _userText;

これらを一緒に使用すると、ドット表記が使用できるようになります。次に、self.userText を使用してどこからでもアクセスする必要があります(カスタム アクセサーを除く)。

self.userText = @"something";
NSString *something = self.userText;
于 2012-07-07T16:42:56.970 に答える
1

ARC を使用しているため、オブジェクトを解放することはできませんが、解放したい場合は nil に設定できます。

代わりに、保持する必要のない var には weak を使用し、保持する予定のものには strong 修飾子を使用できます。

obj-c を学習しているだけの場合は、ARC を無効にすることを強くお勧めします。そうすれば、objective-c がどのように機能するか、および ARC が現在 Apple から推奨されている理由を完全に理解できます。

于 2012-07-07T16:48:24.813 に答える
0

この種の問題を解決する一般的な方法は、NSZombiesを有効にすることです。これは、この例外をスローするよりもわかりやすい方法で割り当て解除されたオブジェクトにメッセージを送信しているときにフラグを立てます。

retainまた、ARCでは、を使用できません。releaseまたはautorelease、これらの呼び出しは、ビルド時にコンパイラーによって追加されるためです。

randuserNSStringsを作成する方法には奇妙な構造がいくつかありますが、何が何であるかrandNumberSを知らなければ、userTextこれ以上のことはできません。

最後に、CocoaとObjective-Cは初めてなので、Appleによるコーディングスタイルガイドがあり、私はコーディング規約ガイドを書きました。

Cocoaを作成するときは、他の開発者がコードを読みやすくするための規則があります。

于 2012-07-07T16:54:20.067 に答える