Ios 选中主线程时UILabel类别块属性崩溃

Ios 选中主线程时UILabel类别块属性崩溃,ios,crash,Ios,Crash,为什么这样编码会导致崩溃: 线程1:xcode->编辑方案时EXCBADACCESS(代码=1,地址=0x0) ->选择诊断->主线程检查器 只有在使用调试模式时才会崩溃。不要使用UILabel名称。您可以使用UILabelCustom接口和实现,然后可以像这样调用它 @interface UILabel (Chainable) @property (nonatomic, readonly) UILabel *(^color)(NSString *value); @end @implement

为什么这样编码会导致崩溃:

线程1:xcode->编辑方案时EXCBADACCESS(代码=1,地址=0x0) ->选择诊断->主线程检查器


只有在使用调试模式时才会崩溃。

不要使用UILabel名称。您可以使用UILabelCustom接口和实现,然后可以像这样调用它

@interface UILabel (Chainable)
@property (nonatomic, readonly) UILabel *(^color)(NSString *value);
@end

@implementation UILabel (Chainable)
- (UILabel *(^)(NSString *value))color {
  return ^(NSString *value) {
    self.textColor = UIColor.whiteColor; // 
    return self;
  };
}
@end

UILabel *label = [UILabel new].color(@"0xffffff");

或者,您也可以将其继承到本机的one UILabel

问题在于名称
-color
是UILabel上的现有扩展。我相信它被弃用的时间比iOS公开的时间长(
textColor
来自iOS 2),但它仍然存在:

UILabelCustom *label = [UILabelCustom new].color(@"0xffffff");
它只是转发到
-textColor

dsdump /System/iOSSupport/System/Library/PrivateFrameworks/UIKitCore.framework | grep color\]
0x00000e95243 -[UILabel(UILabelDeprecatedMethods) color]
在ObjC中,使用相同的方法名创建两个扩展是未定义的行为,您得到的是错误的扩展

如果没有主线程检查器,或者处于发布模式,我希望您会看到这是在悄悄地做什么。当主线程检查器注入检查代码时,我希望事情不完全一致,这会导致崩溃。(但这都是未定义的行为。可能会发生很多事情。我还没有研究编译器的输出以了解到底发生了什么。)


您需要更改此扩展的名称。

然后有一次我命名了一个属性
firstResponder
,所有的麻烦都爆发了。。。!哈哈哈。是的,我曾经在NSMutableArray中添加了一个
-pop
方法,并按照苹果私有分类的工作方式反向实现了它。完全炸毁了导航控制器。不过,那件事让我很生气。苹果公司把
\uuu
作为他们的前缀。它们的所有私有类别都应加前缀。(我明白为什么不推荐的方法可能不会,但他们不应该只添加没有前缀的方便方法,然后要求我们使用前缀来避免它们。)非常感谢。这对我很有用。
                     -[UILabel color]:
0000000000e95243         push       rbp                                         ; Objective C Implementation defined at 0x1629e80 (instance method), DATA XREF=0x1629e80
0000000000e95244         mov        rbp, rsp
0000000000e95247         mov        rsi, qword [0x1675228]                      ; argument "selector" for method _objc_msgSend, @selector(textColor)
0000000000e9524e         pop        rbp
0000000000e9524f         jmp        qword [_objc_msgSend_12b96d8]               ; _objc_msgSend, _objc_msgSend_12b96d8,_objc_msgSend