按钮单击时 iOS 应用程序崩溃
Posted
技术标签:
【中文标题】按钮单击时 iOS 应用程序崩溃【英文标题】:iOS App crash on button click 【发布时间】:2013-05-29 10:27:09 【问题描述】:我正在 for 循环中创建按钮,下面显示的是该代码
for(int i=1;i<[_imageDetailsEntities count];i++)
UIButton *bttn=[UIButton buttonWithType:UIButtonTypeCustom];
bttn.frame=CGRectMake(x,y,75,75);
[_scrollView addSubview:bttn];
ImageDetails *imageDetails=[_imageDetailsEntities objectAtIndex:i];
UIImage *image= [self imageFromPath:imageDetails.imagePath];
[bttn setImage:image forState:UIControlStateNormal];
bttn.tag=i-1;
[bttn addTarget:self action:@selector(imageTapped:) forControlEvents:UIControlEventTouchUpInside];
x=bttn.frame.origin.x+bttn.frame.size.width+distanceBetweenButtons;
if(i%3==0)
x=29;
y=y+bttn.frame.size.height+20;
[_scrollView setContentSize:CGSizeMake(320,y+95)];
-(void)imageTapped:(id)sender
UIButton *bttn=(UIButton*)sender;
[_delegate didFinishChoosingImageAtIndex:bttn.tag];
当我点击按钮时,应用程序崩溃并显示 EXC_Bad 访问消息。我正在使用 ARC。我不确定,我在这里缺少什么。请帮助我
【问题讨论】:
你检查 _delegate 。是零吗? @bit-whacker 这不是问题所在。如果他以编程方式添加事件,他可以使用 void。 @Nishnat Tyagi 我什至通过评论那行代码来检查。但仍然崩溃 你的 imageTapped: 方法调用了吗? 不,它没有被调用。我通过保留断点来检查 【参考方案1】:尝试替换 imageTapped 下的以下行:
[_delegate didFinishChoosingImageAtIndex:bttn.tag];
与
if([_delegate respondsToSelector:@selector(didFinishChoosingImageAtIndex:)])
[_delegate didFinishChoosingImageAtIndex:bttn.tag];
【讨论】:
【参考方案2】:尝试打开NSZombie,看看是否有一些东西被释放得太早。EXC_BAD_ACCESS 意味着当你发送消息时,一些东西已经被释放了。
【讨论】:
【参考方案3】:不知道你的代码到底做了什么,但看起来你的 for 循环有一个一次性错误。 要么使用
for(int i=0;i<[_imageDetailsEntities count];i++)
或
for(int i=1;i<=[_imageDetailsEntities count];i++)
如果你想遍历所有的东西。
【讨论】:
【参考方案4】:您应该在控制器中维护一组按钮,因此 ARC 不会释放它们。
在您的界面中:
@property (nonatomic, strong) NSMutableArray *buttons;
您的代码:
NSMutableArray *buttons = [NSMutableArray array];
for(int i=1;i<[_imageDetailsEntities count];i++)
...your code
[buttons addObject:bttn];
self.buttons = buttons;
如果需要,您可以再次使用该数组从视图中删除按钮。
【讨论】:
如果将它们添加到视图中,它们不会被释放,因为将它们分配给视图会增加保留计数。以上是关于按钮单击时 iOS 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
UIPrintInteractionController 仅在 iOS 14 上单击“取消”按钮时崩溃