如果属性名称以new开头,则应用程序崩溃

Joh*_*tty 4 core-data objective-c nsmanagedobject llvm-clang

在我的项目中,我正在使用coredata.其中一个实体有一个名为newTotal的属性,在其对应的NSManagedObject类中属性声明就像

@property (nonatomic, strong) NSString *newTotal;
Run Code Online (Sandbox Code Playgroud)

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

error: property's synthesized getter follows Cocoa naming convention for returning 'owned' objects
Run Code Online (Sandbox Code Playgroud)

但是在NSManaged对象子类中,它没有显示错误,但是当访问属性时应用程序崩溃,就像EXC_BAD_ACCESS一样.

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

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

avu*_*ess 5

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

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

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

您不能为访问者提供以new开头的名称.这反过来意味着你不能,例如,声明一个名称以new开头的属性,除非你指定一个不同的getter:

//无效

@property NSString *newTitle;
Run Code Online (Sandbox Code Playgroud)

//作品:

@property (getter=theNewTitle) NSString *newTitle;
Run Code Online (Sandbox Code Playgroud)

  • @Johnykutty:Core Data属性`newTotal`不会导致编译器错误,因为它是`@ dynamic`.编译器不"知道"动态创建的getter方法的所有权语义,因此它假定一切正常. - 当然,核心数据模型编译器可能会对此发出警告,但事实并非如此. (3认同)