繁体   English   中英

UIButton操作在一段时间后可能无法正常工作(可能是在进行一些垃圾回收之后)

[英]UIButton action doesn't work after some time (probably after some garbage collection)

我有一个带有约60个调用相同方法的按钮的UIView。 单击按钮时,我通过这种方法打开不同的图像-我使用按钮标签来知道调用了哪个按钮以及要显示哪个图像。 像画廊一样思考它。

由于绘制按钮很困难,因此我使用了Interface Builder并使用该UIView创建了XIB。 我只是将按钮拖动到正确的位置,然后在事件TouchUpInside上将它们连接到我的方法。 我用它来将视图添加到主视图中:

NSArray *xibContents = [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
UIView *tour = [xibContents lastObject];
[self.view addSubview:tour];

到目前为止,到目前为止,效果很好。 不幸的是,该应用程序使用了一段时间后出现了一些问题。 这些按钮仍会突出显示(因此它们仍在这里!),但是没有再执行任何操作。 只是亮点而没有动作。

我不知道为什么,但是垃圾回收器似乎以某种方式破坏了UIButton目标。 为什么? 我该如何解决?

请注意,我尚未以编程方式声明按钮。 我认为将它们放在IB中就足够了。

我也找不到内存警告和UIButton目标的破坏之间的联系。 内存警告确实出现在我的应用程序中,但是大多数时候按钮仍然可以使用。

但是它必须是垃圾收集器,因为该错误完全随机出现。 无法重现此错误,有时会在单击5次后发生,有时会在我的应用中花费10分钟后发生。

您可以尝试像这样加载笔尖:

首先,在标题中创建IBOutlet属性。 然后,当您创建Nib时,将UIView IBOutlet连接到Nib中的顶级视图(所有内容都位于其中)。 然后在您的实现中,像这样加载它:

 [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
 // self.view if in a view controller
 [self addSubview:self.tourView]; 

我的猜测是,可能是按钮的指针停止工作的原因,但不是垃圾回收的原因,因为这不会发生

并进行调试,您可以尝试如下操作:

 for (UIView* view in self.view.subviews)
     if ([view isKindOfClass:[UIButton class]])
     {
               if([self.view respondsToSelector:@selector(myIBAction:)]){
                   NSLog(@"it still sees the method");
                }

         NSLog(@"Button Rect: .2%f, .2%f, .2%f, .2%f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
      }

正如我在评论中提到的

这是将选择器添加到所有按钮的最简单方法。

for (UIView* view in self.view.subviews)
    if ([view isKindOfClass:[UIButton class]])
    {
         //Add selector
    }

出现问题时重新设置目标,就是告诉它大声或更坚持地执行错误的操作。

您必须找到此问题的原因。 运行仪器(构建→配置文件),选择分配模板,然后启动您的应用程序。 运行直到问题发生为止,然后按左上方的红色录音按钮停止在乐器中录音。

在左侧列表中选择分配工具,在时间线正下方的窗口中,从跳转栏中的“统计信息”更改为“对象列表”。 现在,对于要分配,保留,释放和释放的每个对象都有一行。 单击小箭头以查看每个对象的历史记录。 (严格来说,它是针对每个内存地址的;许多对象可以在应用运行时重用同一内存地址。)您还可以按右上角的任何内容进行过滤,展开右侧边栏以获取有关所选内容的完整堆栈跟踪,双击一个条目将其与源代码相关联。

关于乐器有很多东西要学习。 查看文档并在网上搜索。 但是,这肯定会告诉您正在发生的事情,以便您可以推断发生原因或未发生原因的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM