【问题标题】:Application crashes if a property name starts with new如果属性名称以 new 开头,则应用程序崩溃
【发布时间】:2014-02-13 18:39:31
【问题描述】:

在我的项目中,我使用的是 coredata。其中一个实体有一个名为 newTotal 的属性,在其对应的 NSManagedObject 类中,属性声明类似于

@property (nonatomic, strong) NSString *newTotal;

如果我在 NSObject 子类中添加这样的属性,XCode 将显示类似的错误

error: property's synthesized getter follows Cocoa naming convention for returning 'owned' objects

但在 NSManaged 对象子类中,它没有显示错误,而是在访问属性时应用程序崩溃,类似于 EXC_BAD_ACCESS

为什么 XCode 不显示错误但应用程序崩溃?这是 XCode/clang/LLVM 的错误吗?

我知道它与合成有关。 NSManagedObject 子类不合成其中的属性,但 @dynamic 指令只是告诉编译器 getter 和 setter 方法不是由类本身实现,而是由其他地方实现(如超类或将在运行时提供)。但我对此没有明确的想法。任何人都可以对这个问题给出一个清晰的想法吗?

【问题讨论】:

    标签: objective-c core-data nsmanagedobject llvm-clang


    【解决方案1】:

    我可以看到你正在使用 ARC。

    在 ARC 中,内存是为您管理的,但您可以/必须自己做的事情很少。您不能将属性命名为“newXxxx”,因为:

    https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

    您不能为访问者指定以 new 开头的名称。这反过来意味着,例如,除非您指定不同的 getter,否则您不能声明名称以 new 开头的属性:

    // 不起作用:

    @property NSString *newTitle;
    

    // 作品:

    @property (getter=theNewTitle) NSString *newTitle;
    

    【讨论】:

    • 我知道,但是为什么在 NSManageObject 子类中没有显示错误但应用程序崩溃
    • NSManagedObject 主要用于非标准持久属性。它允许您使用 iOS 不直接支持的对象或数据结构。我可以推测,通过对这个对象进行子类化,您可以绕过任何常规内存检查,因为这可能会阻止您使用所需的数据结构。
    • 但是为什么需要显示该错误。你知道你不能这样做,避免它,一切都会好起来的。
    • 因为不是每个人都知道这个错误,而且由于 ARC 的出现比 xCode 本身手动内存管理要晚得多,所以许多老开发人员必须看到这个警告才能知道,一些新的命名规则已经实现。
    • @Johnykutty:核心数据属性newTotal 不会导致编译器错误,因为它是@dynamic。编译器不“知道”动态创建的 getter 方法的所有权语义,因此它假定一切正常。 - 当然,Core Data Model 编译器可能会对此发出警告,但它不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多