1

私はこのコードでカメラのビューを表示するiPhoneアプリケーションを開発しています:

-(void) displayAR {
    [rootViewController presentModalViewController:[self cameraController] animated:NO];
    [displayView setFrame:[[[self cameraController] view] bounds]];
}

そして、このコードでカメラのビューを非表示にします。

- (void) hideAR {
    [[self locationManager] stopUpdatingHeading];
    [[self locationManager] stopUpdatingLocation];

    [[self accelerometerManager] release];

    [rootViewController dismissModalViewControllerAnimated:YES];
}

hiddenARを呼び出すと、次のデバッガーのスクリーンショットでEXC_BAD_ACCESSが取得されます。

代替テキストhttp://img408.imageshack.us/img408/4550/capturadepantalla201006u.png

何かアドバイス?

アップデート:

これでhideARコードを変更しましたが、同じエラーが発生します。

- (void) hideAR {

    [rootViewController dismissModalViewControllerAnimated:YES];
}

rootViewControllerを確認しましたが、nilではありません。

デバッガーのスクリーンショットでわかるように、最後に呼び出されたメソッド(スタックの最初のメソッド)は次のとおり[UIWindowController transitionViewDidComplete:fromView:toView]です。

たぶん、それが却下された後、カメラのビューにアクセスする何かがあります。

2回目の更新

これらのメソッドを含むクラスは次のとおりです。

@implementation AugmentedRealityController

@synthesize locationManager;
@synthesize accelerometerManager;
@synthesize displayView;
@synthesize centerCoordinate;
@synthesize scaleViewsBasedOnDistance;
@synthesize rotateViewsBasedOnPerspective;
@synthesize maximumScaleDistance;
@synthesize minimumScaleFactor;
@synthesize maximumRotationAngle;
@synthesize centerLocation;
@synthesize coordinates = coordinates;
@synthesize debugMode;
@synthesize currentOrientation;
@synthesize degreeRange;
@synthesize rootViewController;

@synthesize cameraController;

- (id)initWithViewController:(UIViewController *)vc {

    coordinates     = [[NSMutableArray alloc] init];
    coordinateViews = [[NSMutableArray alloc] init];
    latestHeading   = -1.0f;
    debugView       = nil;

    [self setRootViewController: vc];

    [self setDebugMode:NO];
    [self setMaximumScaleDistance: 0.0];
    [self setMinimumScaleFactor: 1.0];
    [self setScaleViewsBasedOnDistance: NO];
    [self setRotateViewsBasedOnPerspective: NO];
    [self setMaximumRotationAngle: M_PI / 6.0];

    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [self setDisplayView: [[UIView alloc] initWithFrame: screenRect]];

    [self setCurrentOrientation:UIDeviceOrientationPortrait];
    [self setDegreeRange:[[self displayView] bounds].size.width / 12];

    [vc setView:displayView];

    [self setCameraController: [[[UIImagePickerController alloc] init] autorelease]];
    [[self cameraController] setSourceType: UIImagePickerControllerSourceTypeCamera];
    [[self cameraController] setCameraViewTransform: CGAffineTransformScale([[self cameraController] cameraViewTransform], 1.13f,  1.13f)];
    [[self cameraController] setShowsCameraControls:NO];
    [[self cameraController] setNavigationBarHidden:YES];
    [[self cameraController] setCameraOverlayView:displayView];

    CLLocation *newCenter = [[CLLocation alloc] initWithLatitude:37.41711 longitude:-122.02528];

    [self setCenterLocation: newCenter];
    [newCenter release];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(deviceOrientationDidChange:)
                                                 name: UIDeviceOrientationDidChangeNotification
                                               object:nil];
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];   

    // Inicializa el gestor del GPS y el del acelerómetro.
    [self startListening];

    return self;
}

3番目の更新

NSLogトレースをいくつか入れましたが、hideAR呼び出しの後にdisplayARが呼び出されていることがわかります。また、viewDidAppearメソッドonrootViewControllerもhideARの後に呼び出されていることがわかります。実は、viewDidAppearと呼んでdisplayARいます。

なぜviewDidAppearと呼ばれるのですか?

4番目の更新

失敗している回線を見つけました。これは上の最初の行displayARです:

[rootViewController presentModalViewController:[self cameraController] animated:NO];

何か案は? rootViewControllerそしてcameraController、ゼロではありません。

FITH UPDATE

私のエラーを再現したい場合:

私はnielswhのiPhone-AR-Toolkitを使用しています(ここからダウンロードできます

ARKitDemoの例を変更してライブラリに含め、dismissModalViewを試すことができます。

4

3 に答える 3

1

EXC_BAD_ACCESSは、ほぼ100%の確率で、誤ってリリースされたリソースからのものです。すべてのコードを確認しないと、確実に知る方法はありませんが、私の推測ではaccelerometerManagernil

編集:

viewDidAppearは、表示していた他のビューが非表示になった後に再び表示されるため、ルートビューコントローラーで呼び出されています。

編集2:

スタックトレースの外観から、アニメーションコールバックに一度に登録されたものがあります。それが何であれ、さまざまなビューを表示/非表示にした後は無効になり、知らないうちにリリースされた可能性があります。AnimationDidStopコールバックをリッスンしているものをスニッフィングしてみてください。申し訳ありませんが、これ以上のことはできませんが、このショットガンのデバッグに残っているすべてのコードがありません。

于 2010-06-07T14:21:41.103 に答える
1

まだこれを解決していない場合は、インストルメントツールを使用してゾンビ検出を有効にしてみてください。これにより、エラーを引き起こしているコードの正確な行が強調表示されるため、数回節約できました(ほとんどの場合hehe)

幸運を

ジュール

于 2010-06-07T15:24:45.870 に答える
0

クラッシュはAPIコードの奥深くで発生しています。これは、モーダルビューまたはself.viewのいずれかで実際に問題になる必要があります(selfがビューコントローラーであると想定しています)。

コントローラーのメインビュー(myController.viewなど)に対して何かをしていますか?非モーダルビューを誤って強制終了した場合、モーダルビューから戻ったときに、Exec_Bad_Accessを取得します。

私はこれがこれのためである可能性が高いと思います:

[[self accelerometerManager] release];

...プロパティの管理方法がわからない可能性があることを示します。クラスのdeallocメソッド以外の場所で保持されたプロパティを解放することは決してありません。プロパティの合成アクセサは保持を管理することになっています。他の場所でリリースすると、インスタンスにプロパティオブジェクトがないことを簡単に認識させることができます。

次のようなものがないか、deallocの外部のコントローラーコードを確認してください。

[self.view release];

あなたがそれを見つけた場合、それはおそらくあなたの問題です。もちろん、ビューが参照しているプロパティや不適切にリリースされたニーズも問題を引き起こす可能性があります。

于 2010-06-07T15:19:49.670 に答える