EXC_BAD_ACCESS エラーの意味と解決方法

EXC_BAD_ACCESS というエラーに苦しめられたので、以下に EXC_BAD_ACCESS エラーの意味と、その解決方法を記述する。

EXC_BAD_ACCESS エラーの意味

EXC_BAD_ACCESS は、「あるメモリにアクセスしようとしたが、そのメモリ領域にあったデータは既に解放されていて、何も見つかりませんでした」というエラー。

解決方法 | 私のプログラムの場合

私のプログラムの場合の解決方法を以下に記述する。

EXC_BAD_ACCESS エラーの意味からも分かるように、エラー原因は無数に考えられるので、あくまで1つのケースとして見ていただきたい。一般的に EXC_BAD_ACCESS が発生している箇所さえ発見できれば、解決しやすいだろう。

私のプログラムの場合、 NSArray へのアクセスでエラーが発生していた。

以下の説明では、解決前と解決後の差分が分かる最小限のプログラムを記述する。

具体的な変更点は、

・プロパティを作成(@property)
・@synthesize の記述を追加
・self.accountsArray に値を保存

であった。

編集前のプログラム | AccountViewController.h

#import <UIKit/UIKit.h>
@interface AccountViewController : UITableViewController {
    NSArray *accountsArray;
}

- (void)reloadAccounts;

@end

編集前のプログラム | AccountViewController.m

@implementation AccountViewController

/* === 省略 === */

- (void)reloadAccounts {
    
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:
                                  ACAccountTypeIdentifierTwitter];
    [accountStore requestAccessToAccountsWithType:accountType
                                          options:nil
                                       completion:^(BOOL granted, NSError *error)
     {
         if (granted) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 accountsArray = [accountStore accountsWithAccountType:accountType];
                 [self.tableView reloadData];
             });
         }
     }];
}

@end

編集後のコード | AccountViewController.h

#import <UIKit/UIKit.h>
@interface AccountViewController : UITableViewController {
    NSArray *accountsArray;
}

@property (nonatomic, retain) NSArray *accountsArray;

- (void)reloadAccounts;

@end

編集後のプログラム | AccountViewController.m

@implementation AccountViewController

@synthesize accountsArray = _accountsArray;

/* === 省略 === */

- (void)reloadAccounts {
    
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:
                                  ACAccountTypeIdentifierTwitter];
    [accountStore requestAccessToAccountsWithType:accountType
                                          options:nil
                                       completion:^(BOOL granted, NSError *error)
     {
         if (granted) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 self.accountsArray = [accountStore accountsWithAccountType:accountType];
                 [self.tableView reloadData];
             });
         }
     }];
}

@end

私の場合、これで EXC_BAD_ACCESS エラーがなくなった。以上。

参考にしたサイト: iOS 開発で、EXC_BAD_ACCESS とさよならするための6つのルール

関連記事

Xcode4.5 で IB を使用しない「Hello World」プロジェクトの作成方法
ASO対策 | App Store Optimization
iOS6 で UILabel の中央寄せ ( NSTextAlignmentCenter )

コメント

  • はて??
    結果として修正後EXC_BAD_ACCESSが出なくなったのは良いとして、
    修正前に出ていた理由は??

    2014年1月14日 5:47 PM| 通りすがり

コメントを残す

メールアドレスが公開されることはありません。

This blog is kept spam free by WP-SpamFree.

コメントフィード

トラックバックURL: http://monopocket.jp/blog/objective-c/1802/trackback/