所以,我对我的应用程序中发生的一个非常奇怪的崩溃感到困惑。
背景:我有一个类CustomButton覆盖UIButton。简而言之,界面如下所示:
@interface CustomButton : UIButton
@property (nonatomic, getter = isLoading) BOOL loading;
@end
执行:
@implementation CustomButton
@synthesize loading = loading_;
- (id)init {
if ((self = [UIButton buttonWithType:UIButtonTypeCustom])) {
[self setTitle:NSLocalizedString(@"My Button", nil) forState:UIControlStateNormal];
[[self titleLabel] setShadowColor:[UIColor blackColor]];
[[self titleLabel] setShadowOffset:CGSizeMake(0, -1)];
[self setContentEdgeInsets:UIEdgeInsetsMake(0, 77, 0, 30)];
UIImage *backgroundImage = [[UIImage imageNamed:@"back.png"] stretchableImageWithLeftCapWidth:77 topCapHeight:0];
UIImage *highlightedBackgroundImage = [[UIImage imageNamed:@"back_highlighted.png"] stretchableImageWithLeftCapWidth:77 topCapHeight:0];
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];
[self setBackgroundImage:highlightedBackgroundImage forState:UIControlStateHighlighted];
[self sizeToFit];
}
return self;
}
- (void)setLoading:(BOOL)loading {
if (loading_ != loading) {
// Do fancy things
}
}
@end
问题:我试图在一个类中使用按钮,所以我有属性等等:
...
@property(nonatomic, strong) CustomButton *customButton;
...
@syntesize customButton = customButton_;
...
- (void)aMethod {
self.customButton.loading = YES;
}
...
当然,该按钮已初始化。然后,在执行语句self.bookButton.loading = YES时,我收到此错误
2012-08-28 12:54:25.091 MyApp[9465:15803] -[UIAccessibilityBundle
setLoading:]: unrecognized selector sent to instance 0x8650cc0
2012-08-28 12:54:25.091 MyApp[9465:15803] *** Terminating app due
to uncaught exception 'NSInvalidArgumentException', reason:
'-[UIAccessibilityBundle setLoading:]: unrecognized selector sent to
instance 0x8650cc0'
*** First throw call stack: (0x1ead022 0x203ecd6 0x1eaecbd 0x1e13ed0 0x1e13cb2 0x26bf5 0x257ce 0xfa938f 0xfa96a4 0xfa99a7 0xfb8aea
0x11600be 0x11603c7 0x1160436 0xf10e49 0xf10f34 0xc5bcaac 0xe04b54
0x272e509 0x1de4803 0x1de3d84 0x1de3c9b 0x27887d8 0x278888a 0xee0626
0x14cce 0x27b5 0x1) terminate called throwing an exception
老实说,我不知道要寻找什么。这要么是非常愚蠢的事情,要么是非常微妙的事情。当然,我已经在 google/stackoverflow 上进行了搜索,但没有找到答案。据我所知,当对象不“理解”发送的消息时,通常会发生该错误,但情况并非如此。我什至没有收到编译器的警告。
如果您甚至对我可以寻找的内容有所了解,或者您想了解更多详细信息,请告诉我,谢谢。
编辑:忘记指定我正在使用 ARC。
更新:在下面的答案中,菲利普米尔斯说这可能是一个过早的内存释放问题。这是一个很好的观点,但 Instrument 没有找到任何僵尸。此外,我在 crashy 语句之前放置了一个日志,在那里我尝试打印有关 CustomButton 对象的信息以及与 UIButton 相关的一些内容,例如标题。一切看起来都很好。标题是我设置的那个,框架在那里等等......所以我相信这个对象(一个实际的 UIButton)存在并且它也是预期的那个。唯一的事情就是搞砸了一切的“加载”属性。
解决方案:init方法是问题的根源。它不是初始化按钮子类的实例,而是初始化 UIButton 的实例。因此,因此,找不到“加载”属性。用initWithFrame替换init并使用标准过程覆盖初始化程序,一切都很好。但是,仍然是一个谜,我将UIAccessibilityBundle作为错误的根源而不是UIButton的原因。