Objective-C NSMutableArray 计数导致 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】Objective-C NSMutableArray 计数导致 EXC_BAD_ACCESS【英文标题】:Objective-C NSMutableArray Count Causes EXC_BAD_ACCESS 【发布时间】:2010-05-20 03:17:24 【问题描述】:

我已经被这个问题困扰了好几天,每次我回到它时,我都会让我的代码越来越让自己困惑,哈哈。这就是我想要做的。我有收费的表格列表,我点击一个并显示一个包含收费详细信息的模型视图。现在,当模型出现时,会创建一个对象来获取用户的 XML 列表并对其进行解析并通过自定义委托返回 NSMutableArray。然后我有一个按钮,它显示一个选择器弹出框,当调用弹出框视图时,用户数组在对弹出框视图的 initWithArray 调用中使用。我知道数组中的数据是正确的,但是当调用 [pickerUsers count] 时,我得到一个 EXC_BAD_ACCESS。我认为这是一个内存/所有权问题,但似乎没有任何帮助。任何帮助将不胜感激。

相关代码sn-ps:

Charge Popover(充电细节模型视图):

@interface ChargePopoverViewController .....
NSMutableArray *pickerUserList;
@property (nonatomic, retain) NSMutableArray *pickerUserList;

@implementation ChargePopoverViewController
@synthesize whoOwesPickerButton, pickerUserList;
- (void)viewDidLoad    
    JEHWebAPIPickerUsers *fetcher = [[JEHWebAPIPickerUsers alloc] init];
    fetcher.delegate = self;
    [fetcher fetchUsers];

-(void) JEHWebAPIFetchedUsers:(NSMutableArray *)theData 
    [pickerUserList release];
    pickerUserList = theData;

- (void) pickWhoPaid: (id) sender 
    UserPickerViewController* content = [[UserPickerViewController alloc] initWithArray:pickerUserList];
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:content];
    [popover presentPopoverFromRect:whoPaidPickerButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    content.delegate = self;    

用户选择器视图控制器

@interface UserPickerViewController .....
NSMutableArray *pickerUsers;
@property(nonatomic, retain) NSMutableArray *pickerUsers;

@implementation UserPickerViewController
@synthesize pickerUsers;
-(UserPickerViewController*) initWithArray:(NSMutableArray *)theUsers 
    self = [super init];

    if ( self ) 
        self.pickerUsers = theUsers;
    

    return self;

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 
    // Dies Here EXC_BAD_ACCESS, but NSLog(@"The content of array is%@",pickerUsers); shows correct array data 
    return [pickerUsers count];

如果有帮助,我可以提供额外的代码。提前致谢。

【问题讨论】:

【参考方案1】:

您将保存数组的 ivar 声明为...

@property (nonatomic, retain) NSMutableArray *pickerUserList;

但是你有一个像这样实现的方法:

-(void) JEHWebAPIFetchedUsers:(NSMutableArray *)theData 
    [pickerUserList release];
    pickerUserList = theData;

您没有保留theData,也没有调用合成的setter。如果你做了构建和分析,它应该会发现这个问题并告诉你。如果没有,请提交错误。

【讨论】:

将通过以下方式完成:[theData retain]; self.pickerUserList = theData; 首先,阅读 Cocoa 内存管理指南。从中应该很清楚。接下来,构建和分析您的代码。它应该抓住这一点。最后,我将通过将这两行代码替换为self.pickerUserList = theData; 来修复它

以上是关于Objective-C NSMutableArray 计数导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

NSMutablearray 崩溃删除对象

如何在 UIButtons 之间添加间距 [关闭]

在任务之间留出时间 - iOS

使用 swift 从解析的 Json 中提取数据

如何使用来自 json 的 mutablearray 填充我的 tableview

以编程方式从 ARC 中的导航堆栈中删除 viewController