2011-05-20 8 views
0

EXC_BAD_ACCESSエラーの原因となっているaddToFavourites関数があります。 基本的に、お気に入りビューコントローラには、ユーザーが以前に追加したすべてのお気に入りのリストがあります。お気に入りの1つをクリックするとdetailViewControllerにプッシュされます。これはうまくいきます。ディテール・ビュー・コントローラーでは、お気に入りに追加ボタンがあります。このボタンは、addToFavouritesディクショナリーにキーがすでに存在することが検出された場合、お気に入りから削除されます。この問題は、ユーザーがこのdetailViewControllerをお気に入りページからアクセスし、すべてのdetailViewsを一覧表示するメインページからアクセスするときに発生します。彼らは私がタブバーを持っているので、これを行うことができます。addToFavourites関数を実行するとEXC_BAD_ACCESSが返される

私は、お気に入りのページからアクセスされたdetailViewにいます、お気に入りボタンには「お気に入りから削除」がありますが、これは正しいです。しかし、「お気に入りから削除」ボタンをクリックすると、ボタンが「お気に入りに追加」に変わり、辞書から削除されます。これまでのところすべて正常に動作しています。今度は、同じdetailViewに切り替えると、タブバーの別のタブからこの時間にアクセスすると、最初にお気に入りボタンが「お気に入りから削除」を読み込み、最初にこのボタンをクリックすると「追加」に変わりますお気に入り "をクリックすると、このEXC_BAD_ACCESSエラーが表示されます。任意の助け

- (IBAction)addToFavourites:(id)sender { 
    NSString *type = [[NSUserDefaults standardUserDefaults]objectForKey:@"type"]; 
    if(type == @"v") { 
     NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"]; 
     NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"]; 
     if([[addToFavouritesDictionary allKeys] containsObject:ID1]) { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary removeObjectForKey:ID1]; 
      [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"New Dictionary: %@", addToFavouritesDictionary); 
     } else { 
      NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"]; 
      [addToFavouritesDictionary setObject:Name forKey:ID1]; 
      [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
      //[addToFavouritesDictionary release]; 
     } 
} else { 
     //NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"]; 
     NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"]; 
     if([[addToFavouritesDictionary allKeys] containsObject:ID2]) { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary removeObjectForKey:ID2]; 
      [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Dictionary: %@", addToFavouritesDictionary); 
     } else { 
      NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"]; 
      [addToFavouritesDictionary setObject:Name forKey:ID2]; 
      [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
     } 
    } 
} 

ありがとう:ここ

はaddToFavouritesFunctionです!

答えて

0

それはまあ...あなたのaddToFavouritesDictionaryオブジェクトまたはあなたの名前のオブジェクトのいずれかが割り当て解除された正確にラインをクラッシュ...と値

+0

[OK]を、この行が問題を引き起こしているようです:Name forKey:ID1]; –

+0

これは動作しているようですが、私は初期化でNameオブジェクトを保持しています。唯一の問題は、お気に入りへの追加とお気に入りボタンへの削除が、両方のdetailViewControllerでまだ異なることです。これらを同じに保つにはどうしてですか? –

0

を確認するために、その後にブレークポイントを設定するかどうかを示しデバッガに確認してください。これらのオブジェクトをどのように作成していますか?あなたがそうする前にそれらを解放しているか、最初にそれらを保持していないかのどちらかです。

Objective-C Memory Management

0

おそらくラインを使用するべきではありません。

if(type == @"v") { 

あなたがここでやっていることは、文字列@"v"用ポインタに変数typeためのポインタを比較しています。

if ([type isEqualToString:@"v") { 

EDIT

同じことがNSUserDefaultsにテキストを格納することですあなたのタイトルを保つための最も簡単な方法:代わりに、文字列のを内容を比較する方法を使用する必要があります。あなたは、ボタンが押されるたびに以下のような何かができる:

// For "Add to Favorites" 
[[NSUserDefaults standardUserDefaults] setObject:@"+ Favorites" forKey:@"ButtonState"]; 

// For "Remove from Favorites" 
[[NSUserDefaults standardUserDefaults] setObject:@"- Favorites" forKey:@"ButtonState"]; 

は、その後、あなたはこのような何かを実行するだろうというときのビューのロード:[addToFavouritesDictionaryのsetObject:

[favoritesButton setTitle:(NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:@"ButtonState"] forState:UIControlStateNormal]; 
+0

ああ、そういう点を見つけてくれてありがとう。両方のビューコントローラでUIButtonsタイトルを同じに保つ方法に関するアイデアはありますか?私はviewWillAppearのメソッドを配置するか?ありがとうございました –

+0

あなたの質問に役立つ私の編集をチェックしてください。 – FreeAsInBeer

関連する問題