我已经缩小了一个丑陋的bug,但由于它似乎是nib / Interface Builder内部的东西,我不知道下一步该做什么。
我在IB中创建了一个用作自定义对话框的UIView。它显示一条消息和两个按钮。 (继续或取消。)两个按钮都在Interface Builder中设置了背景图像。
正在处理取消按钮的背景图像的方式有问题。使用NSZombieEnabled,我一直在运行该程序。通常,下面的方法记录下来:
-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
dialogCancelButtonBackground <UIImage: 0x3b3a920>
这完全正常。但是,有时会这样做(如果我通过快速点击一些界面按钮来“抢占”用户界面,我可以稍微重复一遍):
-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
*** -[UIImage retain]: message sent to deallocated instance 0x3b3a920
正如您所看到的,NSZombieEnabled发现取消按钮的背景图像已被取消分配,但正在发送保留消息。 (不是我,虽然......那个图像只用 用于这个按钮,而仅在Interface Builder中访问。我没有任何IBOutlets或任何变量与该图像相关联。)
那么,嗯,现在呢?
有时候,它不是一个被留下来作为僵尸的保留信息,有时它是isKindOfClass:
//(the object address is always dialogCancelButton.currentBackgroundImage)
-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0
//occasionally, these come along, too:
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement doesNotRecognizeSelector: -- abort
这是我的自定义UIViews“showInView”方法:
- (void)showInView:superView
title:(NSString*)title
message:(NSString*)message
cancelText:(NSString*)cancelText
proceedText:(NSString*)proceedText {
NSLog(@"%s",__PRETTY_FUNCTION__);
NSLog(@"dialogProceedButton %@", dialogProceedButton);
NSLog(@"dialogProceedButtonBackground %@", dialogProceedButton.currentBackgroundImage);
NSLog(@"dialogCancelButton %@", dialogCancelButton);
NSLog(@"dialogCancelButtonBackground %@", dialogCancelButton.currentBackgroundImage);
CGRect rect;
dialogTitle.text = title;
dialogMessage.text = message;
[dialogProceedButton setTitle:proceedText forState:UIControlStateNormal];
if (cancelText == @"") { // SINGLE BUTTON DIALOG
dialogCancelButton.hidden = YES;
rect = [dialogProceedButton frame];
rect.origin.x = 195; //center the button
[dialogProceedButton setFrame:rect];
} else {
[dialogCancelButton setTitle:cancelText forState:UIControlStateNormal];
dialogCancelButton.hidden = NO;
rect = [dialogProceedButton frame];
rect.origin.x = 286; //button on right of dialog box
[dialogProceedButton setFrame:rect];
}
[UIView beginAnimations:@"modalAppears" context:nil];
[UIView setAnimationDuration:0.5];
[superView addSubview:self];
self.alpha = 1.0;
[UIView commitAnimations];
}
谢谢!
答案 0 :(得分:3)
好的,这个是什么的。我决定尝试反转Proceed和Cancel按钮的图像。结果是,继续按钮图像会导致崩溃(就像间歇性一样)。我完全删除了我的项目和Interface Builder中的图像。然后我添加了一个新名称的新副本并将其连接起来。
通过之前的设置,我能够在大约40%的时间内重现崩溃。在这些变化之后,我已经尝试了大约20次来重现崩溃,现在我根本无法重现它。
如果图像或笔尖已损坏,为什么,为什么,为什么会导致随机/间歇性症状呢?
Whattathing。希望它能够很好地修复。
而且......所以还有更多内容。结果我发现我有巧合地在我的(不完整的)指令视图中使用与占位符相同的图像。为了临时方便,我使用[UIImage imageNamed:]来抓取图像。它被正确分配和发布,但似乎IB与imageNamed:方法和/或缓存的合作并不完美。
事实上,当我去抓取图像的新副本时,我还给它一个新的名称,这意味着现在IB按钮图像和临时占位符图像不再相同图像完全没有。
我几天前回到我的项目备份来测试我的理论。我所做的就是告诉说明视图使用不同的占位符图像。撞毁了。
这可能是一个SDK错误。不应该有任何理由不在IB中使用图像,也可以使用imageNamed在其他地方使用相同的图像:如果我在这些日子里感到狡猾或无聊,也许我会把它提炼成一个示例项目发送到Apple雷达。
答案 1 :(得分:0)
您的XIB文件如何连接到您的视图?您定义了哪些IBOutlets?我真的怀疑你是否以你描述的方式解决了你的问题。