1

シミュレーターで動作するかなり大きなアプリがありますが、iPhone デバイスで過剰にリリースされたオブジェクト シナリオを作成します。NSzombies は、オブジェクトがシミュレーターで過度にリリースされておらず、NSZombies がデバイスで機能しないことを除いて、進むべき道のように見えます。何時間ものロギングを通じて、私が実行したときの間のどこかにそれを突き止めることができるようです -

[locManager startUpdatingLocation] と - の開始

(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

それがシミュレーターで機能する理由を説明しています。私はロケーション能力を検出せず、そのロケーションコードを実行しません。

[locManager startUpdatingLocation] の直前と直後にインラインで NSLog を実行すると、NSString オブジェクトが割り当てられて存在します。しかし、アプリが実行されて locationManager にヒットすると、NSLog は NSString の割り当てが解除され、なくなったことを示します。この文字列オブジェクトは、場所の処理や機能とはまったく関係ありません。無関係の NSString。他のすべての潜在的な活動をコメントアウトし、すべての明示的なリリースコードをコメントアウトしましたが、それが発生した瞬間を見つけることができません.

lldb がウォッチポイントをサポートしていないようで、gdb がそれらをサポートしているように見えることにさらに不満を感じていますが、このバージョンでは機能しないようです。gdb はハードウェア ウォッチポイントを設定し、Xcode は実行中と表示しますが、30 分後も視覚的なアクティビティや中断はありません。

私はライオン、Xcode 4.1.1、そしてコーヒーを飲みすぎています。

このリリースされた NSString オブジェクトを、このような狭い範囲のアクティビティと限られたツールで見つけるには、どのようなアプローチをとればよいでしょうか?

4

2 に答える 2

5

昔々、リリースされたオブジェクトを特定する複雑なケースがあったため、このオブジェクトから MyObject に継承し、次の方法で保持とリリースをオーバーライドしました。

DebugString.h ファイルは次のとおりです。

#import <Foundation/Foundation.h>

@interface DebugString : NSString

@end

DebugString.m ファイルは次のとおりです。

#import "DebugString.h"

@implementation DebugString

- (id) retain {
    NSLog(@"%i", [self retainCount]);
    return [super retain];
}

- (void) release {
    NSLog(@"%i", [self retainCount]);
    [super release];
}

@end

このメソッド内にブレーク ポイントを配置し、クラッシュが予想される段階でそれらをオンにしました。その後、この通話を 1 つずつ実行し始めたところ、問題が見つかりました。複雑ですが、いつか役立つかもしれません。そのようなアプローチがフォーラムで説明されているのを見たことがありません。たぶんそれもあなたを助けるでしょう。

于 2011-08-09T02:03:32.260 に答える
0

シミュレーターで実行しているときに、場所「didUpdate」を手動で呼び出します。場所マネージャーを起動した後、少なくとも 2 回呼び出し、約 5 秒でタイムアウトします。これにより、電話と同じバグが発生するはずです。その後、NSZombies を使用できます。

また、シミュレーターはロケーション コードを実行できる必要があります。これは 4.2 では壊れていると思いましたが、4.1 では問題ありませんでした。

于 2011-08-09T06:21:48.627 に答える