1

My application was working fine, and a couple minutes later, after editing another part of the app, it started throwing the EXC_BAD_ACCESS error from a view controller that I wasn't even working on. The only thing I did between that I can think that may have affected it is, I Edit->Refractor->Convert to Obj-C ARC... I only did it it for a specified file also, not my whole project which is confusing. I was following this tutorial when I believe the error started happening... http://sonnyparlin.com/2011/12/pulltorefresh-ios-5-and-arc-tutorial/ Also, the app launches fine, it just crashes when a cell is clicked on in the tableview. Any help would be greatly appreciated!

Error happens on this line:

self.releaselink = [[sortedArray objectAtIndex:indexPath.row] objectForKey:@"link"];

Here's my code where the error is originating from:

@implementation PressReleaseViewController

@synthesize releaselink;

UILabel *departmentNamesLabel;
CGRect *departmentNamesFrame;

- (void)viewDidLoad {

// Load path to plist and sort based on "name"

NSString *path = [[NSBundle mainBundle] pathForResource:
                  @"departments" ofType:@"plist"];
array = [[NSMutableArray alloc] initWithContentsOfFile:path];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
sortedArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
}

// How many sections are in the table

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

// Set how many rows of cells are in the table

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [sortedArray count];
}

// Set up table view and format for cells

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

// Set text for each cell

cell.textLabel.text = [[sortedArray objectAtIndex:indexPath.row] objectForKey:@"name"];

return cell;
}

// Set how tall each cell is

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 40;
}

// Set push to new view controller

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

self.releaselink = [[sortedArray objectAtIndex:indexPath.row] objectForKey:@"link"];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil];
MainViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"main"];
[vc setReleaseLink:self.releaselink];
[self.navigationController pushViewController:vc animated:YES];

}

- (void)viewDidUnload {
pressReleases = nil;
[super viewDidUnload];
}
@end

Header file"

@interface PressReleaseViewController : UITableViewController {

IBOutlet UITableView *pressReleases;
NSArray *array;
NSArray *sortedArray;
NSString *releaselink;

}

@property (nonatomic, retain) NSString *releaselink;

@end
4

1 に答える 1

12

EXC_BAD_ACCESSアプリケーションがすでに解放されているオブジェクトにアクセスしようとすると、エラーが発生します。プロジェクトをARCに変換した後に問題が発生した場合は、どこかで(ARCに代わって)Zealousリリース呼び出しが行われています。sortedArrayクラスの強力なプロパティを作成し、変数を次のように設定してみてください。

self.sortedArray = [array sortUsingDescriptor:...];

sortUsingDescriptor:おそらく自動解放されたオブジェクトを返すので、それはそれであるに違いありません。非アークプロジェクトでは、retain呼び出しでその呼び出しをカプセル化する必要があります。

[[array sortUsingDescriptor:...]retain];
于 2012-09-07T20:42:19.660 に答える