2011-07-30 9 views
0

私は、アプリケーションデリゲートでタブバーコントローラを作成します。最初のビューは、最初のビューコントローラと呼ばれていないすなわち UITabBarControllerがEXC_BAD_ACCESSをスローする

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

UINavigationController *localNav; 

tabBar = [[UITabBarController alloc] init]; 
NSMutableArray *controllerArray = [[NSMutableArray alloc] initWithCapacity:2]; 

FirstViewController *firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil]; 
localNav = [[UINavigationController alloc] initWithRootViewController:FirstViewController]; 
localNav.navigationBar.tintColor = [UIColor blackColor]; 

[controllerArray addObject:localNav]; 

[firstViewController release]; 

SecondViewController *secondViewController; 
secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
localNav = [[UINavigationController alloc] initWithRootViewController:secondViewController]; 
[controllerArray addObject:localNav]; 
[localNav release]; 
[SecondViewController release]; 

tabBar.viewControllers = controllerArray; 

[controllerArray release]; 
[localNav release]; 

[window addSubview:tabBar.view]; 

[self.window makeKeyAndVisible]; 

return YES; 
} 

私は変数名を変更(:ここ

#import <UIKit/UIKit.h> 

@interface appAppDelegate : NSObject <UIApplicationDelegate> { 
UIWindow *window; 
UITabBarController *tabBar; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) UITabBarController *tabBar; 

@end 

メートルファイル内の関連する機能がされています。ここでの.hと.mファイルファイルがあります)。アプリはロードし、私が選択できる2つのタブを表示します。私がモーダルポップアップを表示しようとすると、問題が発生します。私はボタンを押すとモーダルを表示する必要があります。

ここに.hファイルがあります。カスタムボタンは、UIButtonをまっすぐに延長するだけで、ボタンのコーナーを丸くします。デリゲートは、ちょうど大丈夫ですかキャンセル2つのボタンの機能を持っている:私は、ボタンを押すのための機能を実行すると

#import <UIKit/UIKit.h> 
#import "CustomButton.h" 
#import "StartModal.h" 
#import "CurrentEntry.h" 

@interface FirstViewController : UIViewController <StartModalDelegate>{ 
CustomButton *startEntry; 

} 

@property (nonatomic, retain) IBOutlet CustomButton *startEntry; 

- (IBAction) startLogEntry; 
- (void) locationSelection; 

- (void) dismissHandler; 
- (void) saveHandler; 

@end

EXC_BAD_ACCESSがでてきます。ここには.mファイルがあります:

- (IBAction) startLogEntry { 
NSLog(@"start the entry here"); 

StartPoopModal *modal = [[StartModal alloc] initWithNibName:@"StartModal" bundle:nil]; 
[modal setDelegate:self]; 

UINavigationController *localNav; 
localNav = [[UINavigationController alloc] initWithRootViewController:modal]; 
localNav.navigationBar.tintColor = [UIColor blackColor]; 
[self.tabBarController presentModalViewController:localNav animated:YES]; 
[modal release]; 
} 

[self.tabBarController presentModalViewController ....]はエラーをスローします。これは過去に働いていて何らかの理由でエラーを投げています。私が知る限り、私はそれを変更していない。私はバージョン管理のどのような形でもこれを持っていないので、私はそれを二重チェックすることはできません。

+0

クラッシュログはありますか? –

+0

私はそれを理解しました。パトリックはリリースについて良い点を挙げている。私は1つのビューコントローラを作成し、それを間違った場所にコピー/貼り付け、完全には見ていませんでした。間違っているタイプに関するもう一つの点は、私が質問で正しく名前を更新しなかったので問題ではありませんでした。私は、ビュー(タブ、ナビゲーションバー、およびモーダル)を使用するためのさまざまな方法をすべて理解し、StartPoopModalという名前をつけたばかだと思っていましたが、その質問には使いたくありませんでした。とにかく問題が何だったのか、それはモーダルのサブビューでした(もう一度試してみると) – Joshua

答えて

0

ライン

[self.tabBarController presentModalViewController:localNav animated:YES]; 

は、あなたが悪いのポインタを探してしなければならない、悪いアクセス例外(EXC_BAD_ACCESS)を引き起こす場合。そこには4つのポインタが含まれています:selfself.tabBarControllerlocalNav、およびmodalです。

私は型が一致しないので、あなたがmodalを割り当てる行が怪しいですが、StartModalが悪いアクセス例外が発生することはありませんその後、実際のクラスであればという@PatrickAnarnaに同意します。ただし、modalがnilの場合、タブバーコントローラがmodalのビューにアクセスしようとすると、不正なアクセス例外が予想されます。または、具体的には、タブバーコントローラがlocalNavのビューにアクセスしようとしたときに、localNavmodalのビューにアクセスしようとします。

localNavがどのようにゼロまたは無効になるかわかりませんが、それでも確認する必要があります。 selfは、インスタンスメソッドではゼロにならないようにしてください。selfがタブバーコントローラによって管理されるビューコントローラの場合、self.tabBarControllerはnilまたはinvalidであってはなりません。しかし、コードが正常に動作するはずですが、そうでないと正しいと仮定してはいけません。

とにかく、1日の終わりに、エラーは、間違ったポインタの逆参照によって引き起こされます。逆参照されているポインタを見つけたら、エラーが見つかります。

+0

私は、モーダルのサブビューであることを発見しました。モーダルはゼロではありませんでしたが、使用しようとするまでエラーは発生しませんでした。 – Joshua

+0

私は答えとしてあなたを選びましたが、パトリックはメモリ管理についての良い点を提起しましたが(私たちはもっと注意を払うことができます)、それは問題の解決策ではなかったので、あなたの答えは手元の問題にもっと役立ちました。少なくとも、iPhoneのカテゴリでは、メモリ管理について間違いを犯すと実際の問題ではなく投票されたように思える。それは漏れだったが、それはエラーがスローされた場所ではなかったし、あなたのようにコメントまたは脇にされている必要があります:) – Joshua

2

最初にこれを行いました。

localNav = [[UINavigationController alloc] initWithRootViewController:FirstViewController]; 
[controllerArray addObject:localNav]; 

これを実行しました。それはそこのリークです。新しいOWNEDオブジェクトを与える前にローカルナビゲーションを解放していませんでした。その後

localNav = [[UINavigationController alloc] initWithRootViewController:secondViewController]; 
[controllerArray addObject:localNav]; 

しばらく再び、あなたは再び[localNavリリース]と呼ばれた後、あなたは、この

[localNav release]; 

をしました。

も、この行が疑わしい

StartPoopModal *modal = [[StartModal alloc] initWithNibName:@"StartModal" bundle:nil]; 

あなたは私が言うことができるすべては、上記のすべての悪いプログラミングをチェックして、メモリ管理のルールをよく読んでくださいある2つの異なるクラス

を割り当てます。 http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

本当に役立ちます。

+0

私は管理された言語に慣れています。時にはメモリ管理が私を捨てます。概念的な見地から、それは簡単だと思われますが、実際には... – Joshua

関連する問題