我已经找到了一个很棘手的问题,但由于它似乎是nib/Interface Builder内部的问题,我不知道该怎么办。
我在IB中创建了一个UIView,用作自定义对话框。它显示一条消息和两个按钮(继续或取消)。两个按钮都在Interface Builder中设置了背景图像。
某些东西处理取消按钮的背景图像时出了问题。使用NSZombieEnabled,我一直在运行这个程序。最常见的情况是下面的方法记录了这个问题:
如您所见,NSZombieEnabled发现取消按钮的背景图像已被释放,但仍收到了一个保留消息。(不是我发送的...该图像仅用于此按钮,且仅在Interface Builder中访问。我没有任何IBOutlets或与该图像相关联的变量。)
那么,现在怎么办?
编辑:
有时,并不是一个保留消息被捕获为zombie,有时是isKindOfClass:。
我在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>
这是完全正常的。但有时会出现这种情况(如果我快速点击某些界面按钮来“加快”UI速度,我可以让它重复一些):
-[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或与该图像相关联的变量。)
那么,现在怎么办?
编辑:
有时,并不是一个保留消息被捕获为zombie,有时是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
This is my custom UIViews "showInView" method:
- (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];
}
谢谢!