我有一个神秘的EXC_BAD_ACCESS当改变一些UILabel的框架。坠机是随机的,通常我得重复几分钟。
启用NSZombies以及其他内存调试标志(NSDebugEnabled、MallocStackLogging)没有帮助,崩溃仍然保持不透明:只是控制台中没有消息的BAD_ACCESS。目标看起来是正确的,并且是活着的,所以它看起来不像一个被释放的内存问题。
为了获得更多信息,我对UILabel进行了子类化,并重写了崩溃函数:
@implementation TestUILabel
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event {
return [super actionForLayer:layer forKey:event];
}
@end它在超级程序的方法中崩溃,但在检查时一切似乎都是正确的(打印retainCount用于“self”和“layer”分别给出了3和2):
(gdb) po self < TestUILabel: 0x6ac2800;baseClass = UILabel;框架= (173 174;0);文本= '54平方米‘;不透明= NO;自动调整大小= LM+TM;autoresizesSubviews = NO;userInteractionEnabled = NO;动画={ position=< CABasicAnimation: 0xe07ba60>;};layer =< CALayer: 0xbf1b950>> (gdb) po事件 界 (gdb) po层
发布于 2011-09-08 06:51:43
你可能已经查过了,但值得一试.
您确定没有做任何会影响后台线程中任何UI元素的操作吗?也许您正在做一些与此搜索相关的计算,并且它更改了某个视图的属性。
在我忘记了一个performSelectorOnMainThread:withObject:waitUntilDone:调用,然后在后台更改UI的情况下,我看到了他的这种情况。
发布于 2018-05-24 02:41:27
此崩溃具有似乎使用UIKit类或函数的非主线程。一般来说,只有从主线程使用UIKit才是安全的。从后台线程调用UIKit会导致不可预测的行为(比如崩溃!)。请检查您的所有代码(不在主线程上)是否已被Apple显式标记为在后台使用是安全的。
外部资源:
https://stackoverflow.com/questions/6384248
复制相似问题