调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)
Posted
技术标签:
【中文标题】调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)【英文标题】:EXC_BAD_ACCESS (code=2 or code 1) when call button action 【发布时间】:2013-06-05 22:48:33 【问题描述】:我正在使用iCarousel Library,但遇到了一些问题。
在控件演示示例项目中,使用了 XIB 文件,视图设置如下:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
if (!view)
//load new item view instance from nib
//control events are bound to view controller in nib file
//note that it is only safe to use the reusingView if we return the same nib for each
//item view, if different items have different contents, ignore the reusingView value
view = [[[NSBundle mainBundle] loadNibNamed:@"ItemView" owner:self options:nil] lastObject];
return view;
因为我使用的是 Storyboard,所以我创建了一个视图控制器并像这样设置视图:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
NSString * storyboardName = @"MainStoryboard";
NSString * viewControllerID = @"DuuinNewsItem";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
//create new view if no view is available for recycling
if (!view)
DUDuuin *tDuuin = [_duuins objectAtIndex:index];
DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
controller.duuin = tDuuin;
view = controller.view;
[view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];
return view;
当我向视图中的任何按钮添加操作时,我会收到错误消息:
我尝试了很多 *** 中推荐的东西,但我找不到解决方案:
我试过了:
将出口设置为强(有人说这是一个问题,因为 ARC) 在操作中删除发件人 在 View Controller 中添加具有 icarousel 的方法****更新****
现在我看到了其他问题。当我在 DUNewsItemViewController 中定义 Action 并在模拟器中尝试时,它说:
-[__NSCFType btnTest:]: unrecognized selector sent to instance 0x1577c650
所以,我在 View Controller 的 .m 文件中添加了具有 iCarousel 的方法,问题仍然相同:
EXC_BAD_ACCESS (code=2)
一些信息:
我正在使用 ARC 故事板上有 观看次数是动态的【问题讨论】:
你设置的强势出口是什么?iCarousel
、DUNewsItemViewController
或 View
的插座?
按钮@Firo的出口
【参考方案1】:
您的主要问题不是具体的视图,而是您的 DUNewsItemViewController
实例。您在提供的方法中创建控制器并返回视图。该视图由iCarousel
保留。另一方面,您的 DUNewsItemViewController
不是。没有什么强烈指向它。由于没有指向它的强指针,它正在被释放。您的视图与所有按钮都正确显示,因为它再次保留在您的DUNewsItemViewController
之外。当按下按钮时,它会尝试访问其操作方法并失败,因为控制器不再存在。
要解决此问题,您需要创建一个指向控制器的强指针(而不是您之前尝试的按钮)。我不推荐一种完美的策略,而是一种有效的策略。
您可以创建一个可变数组(作为属性)并在创建视图控制器时将它们添加到其中(如果有多个)。这样iCarousel
的委托/数据源的控制器就持有对它的引用:
if (!view)
DUDuuin *tDuuin = [_duuins objectAtIndex:index];
DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
// Add controller to array to hold a strong reference to it.
[self.myMutableArray addObject:controller];
//
controller.duuin = tDuuin;
view = controller.view;
[view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];
否则,如果只有一个(或几个),您可以创建独特的网点:
@property (strong, nonatomic) DUNewsItemViewController *firstVC;
并在您的 carousel:viewForItemAtIndex:reusingView:view
方法中包含一行 self.firstVC = controller
。
如果有什么不明白的,请告诉我。同样,可能有更好的实现,但这应该可行。 XIB 在示例中起作用的原因是因为它们只是 UIViews
而不是像您使用的 UIViewController
子类。同样,您的视图正常工作(显示,就像示例一样),但是您的控制器正在被释放(不像示例,因为没有使用控制器)。
【讨论】:
哇,谢谢,这很有意义!让我试试,我会告诉你它是否有效! @Firo 它不起作用兄弟,我在 te .m 文件中声明了一个属性@property (nonatomic, strong) NSMutableArray *views;
,我添加了对象,但问题是一样的。 我更新了问题 @Firo
不要将视图添加到数组中。添加视图控制器。 (我假设您刚刚添加了视图,因为您的数组称为 views
我将 ViewControllers 添加到数组中,我在 carousel:viewForItemAtIndex:reusingView:view 中调用视图,因为它返回一个视图,兄弟有什么想法吗? @Firo
我更新了我的答案,看看这是否是您将控制器添加到阵列的方式。以上是关于调用按钮操作时的 EXC_BAD_ACCESS(代码 = 2 或代码 1)的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 模拟器启动时的 EXC_BAD_ACCESS。应用程序在设备上运行
启动 AVAudioPlayer 时的 EXC_BAD_ACCESS
执行 segue 时的 EXC_BAD_ACCESS(code 1, address=0x1)