2011-07-19 6 views
0

私のiPhoneアプリは3つのナビゲーションコントローラをロードするタブバーコントローラです。最初のビューはUIViewControllerで、2番目と3番目のビューはUITableViewControllerです。iPhoneのEXC_BAD_ACCESSは、タブバーのビューコントローラを変更した後に表示されます。

すべての私のアプリケーションでは、私はアプリケーションデリゲートに格納されているコアデータから来るオブジェクト "車"にアクセスします。私のタブバーの最初のナビゲーションコントローラビューを変更した後、私は3つのナビゲーションコントローラ(設定)内のオブジェクトにアクセスするときに常にEXC_BAD_ACCESSを取得します。デバッガは@synthesize userCar=_userCar;にエラーを表示します。

私のアプリケーションで変更すると、私のタブバーの選択されたインデックスを変えると変です。だから、デフォルト(index = 0)をロードするとき、設定ビュー(index = 2)に入るとクラッシュしますが、最初に設定ビューをロードすると、いつでも私のアプリが大きく動いています。

クラッシュ:

// Display the window with the tab bar. 
[self.window addSubview:[self.tabBarController view]]; 
[self.window makeKeyAndVisible]; 

MyAppDelegateクラスのロード場合はクラッシュしない:私は私のメインウィンドウでNIB名とクラス名をバックに変更する場合

// Loads the 3 view (Settings) to avoid crash... 
[self.tabBarController setSelectedIndex:2]; 

// Display the window with the tab bar. 
[self.window addSubview:[self.tabBarController view]]; 
[self.window makeKeyAndVisible]; 

は、だから私は、理解していません.xib(私のタブバーコントローラなどがあります)を以前のものに戻して、それは再び完全に動作します。私は、プロジェクトをクリーニングし、Xcodeを再起動し、シミュレータとデバイスからアプリケーションを削除してみましたが、何も動作しません。

ありがとう!

UPDATE 1

だから私はすべての私のビューコントローラでこの@property (nonatomic, retain) Car *userCar;のように私の車のオブジェクトを宣言します。

次に、現在の車、利用者が選択された1つを得るために、私はこれを実行します。

// Get the latest user car selected. 
self.userCar = [EcoAppAppDelegate userCar]; 

をユーザーが作成した場合、私は私のアプリデリゲートは、私は、私は車で遊んでみよう2つの機能を持っています新しいものはそれが自動的に保存されている、選択された別の車の設定でprevisoulyそれを保存するprevisouly選択した場合。アプリデリゲートの.mファイルで

+ (Car *)userCar; 
+ (void)setUserCar:(Car *)newCar; 

:コードの

// On top of the file. 
static Car *_userCar; 

#pragma mark - Static functions 

+ (Car *)userCar 
{ 
    return _userCar; 
} 

+ (void)setUserCar:(Car *)newCar 
{ 
    if (_userCar != newCar) { 
     if (newCar != nil) { 
      [_userCar release]; 
      _userCar = nil; 
      _userCar = [newCar retain]; 
     } 
     else { 
      [_userCar release]; 
      _userCar = nil; 
     } 
    } 
} 

最後のピース、私はコアデータから車を得るとき、私はそれがこの方法を行う(時.mファイルでアプリデリゲートdidFinishLaunchingWithOptionsで例えばアプリ)の開始:

// Load the car. 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]]; 
[fetchRequest setEntity:entity]; 

// Set predicate and sort orderings... 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = 1"]; 
[fetchRequest setPredicate:predicate]; 

// Execute the fetch -- create a mutable copy of the result. 
NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 
if (mutableFetchResults != nil && [mutableFetchResults count] > 0) { 
    // Get the car selected. 
    _userCar = (Car *)[mutableFetchResults objectAtIndex:0]; 
} 
else { 
    // Handle error. 
    _userCar = nil; 
} 

// Memory management. 
[fetchRequest release]; 
[mutableFetchResults release]; 
+0

コントローラ2のCoreDataからオブジェクトを取得するコードを投稿する必要があります。おそらく問題がある場所です。 – PengOne

+0

userCar変数の@propertiesは何ですか?また、3つのView Controllerからどのようにアクセスしますか? – Joe

+0

私はコードを更新しました。十分ではないと私はもっと多くのものを追加することができます私に知らせてください。しかし、私はビューコントローラにカーオブジェクトを持っていて、アプリケーションデリゲートから読み込んでいます。その後、車の設定を変更すると(ユーザーが新しい車を作成して自動選択するか、以前に作成した別の以前の車を選択するだけで、アプリケーションのデリゲートで車が更新されます)。 – Dachmt

答えて

1

私は、主な問題は、あなたがコアデータから取得している車のオブジェクトが保持されていないことであると信じています。これはプログラムの最初の時点では有効なオブジェクトですが、いったんすべてのオブジェクトの読み込みが完了すると、オートレリースされます。

あなたはこれまであなたcoredataコードを変更することで、この問題を解決することができます

// Execute the fetch -- create a mutable copy of the result. 
NSError *error = nil; 
NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchResults != nil && [fetchResults count] > 0) { 
    // Get the car selected. 
    _userCar = (Car *)[[fetchResults objectAtIndex:0] retain]; 
} else { 
    // Handle error. 
    _userCar = nil; 
} 

注意retain。また、フェッチ結果のコピーを変更する必要はありません。

+0

すごい@ lazycs!ありがとうございます。私は 'retain(void)setUserCar:(Car *)newCar'を私が' retain'を行うところで使っていないので、私のアプリケーションデリゲートの車の初期化には欠けていました。私はアレイの(車の)必要な別のコードのコピーを過去にコピーしたので、私は変更可能なコピーを作成していた、私はそれにもっと注意する必要があります... – Dachmt

関連する問題