Objective-C 错误:属性“活动”是类“例程”上的标量类型。无法为其生成 getter 方法

Posted

技术标签:

【中文标题】Objective-C 错误:属性“活动”是类“例程”上的标量类型。无法为其生成 getter 方法【英文标题】:Objective-C error: Property 'active' is a scalar type on class 'Routine'. Cannot generate a getter method for it 【发布时间】:2009-07-20 06:55:29 【问题描述】:

在 iphone 模拟器 (3.0 OS) 中运行以下命令时出现上述错误:

@interface Routine : NSManagedObject 



@property (nonatomic) BOOL active;

@implementation Routine
@dynamic active
@end

如您所见,我将 NSManagedObject 子类化,因为我使用的是 Core Data。在我的数据模型中,“active”是布尔类型的选项属性。

我在这里做错了什么?

谢谢!

【问题讨论】:

【参考方案1】:

从 CD 中出来的所有东西都是一个对象,而不是一个缩放器。因此,将您的代码更改为:

@interface Routine : NSManagedObject 



@property (nonatomic) NSNumber * active;

@implementation Routine
@dynamic active
@end

如果你愿意,你可以添加一个方便的访问器来处理它作为一个标量:

- (BOOL) activeScalar 
  return self.active.boolValue;


- (void) setActiveScalar:(BOOL)active_ 
  self.active = [NSNumber numberWithBool:active_];

最后,如果您在模型编辑器中按住 Control 键单击某个属性,它将弹出一个巨大的上下文菜单,其中包括将适当的声明和定义复制到粘贴板上的选项,因此您不必自己编写它们.

【讨论】:

小错误:改成:- (void) setActiveScalar:(BOOL)active_ self.active = [NSNumber numberWithBool:active_]; 【参考方案2】:

对于它的价值,我发现文档为标量提供了稍微不同的解决方案。通常不鼓励您使用标量而不是对象,但如果您这样做了,http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html 会解释如何做到这一点。您使用“primitiveName”和“setPrimitiveName”来访问自动生成的访问器,这些访问器将您的标量放入对象(例如 NSNumber)。然后创建一个标量 @property 并为使用原语的属性编写访问器。

这似乎很昂贵,因为 CoreData 将您的属性作为标量存储在持久存储中,并将其转换为对象以将其作为基元公开。因此,当您实现 setName 时,当我阅读文档和示例代码时,您的值被放置在一个对象中,然后在 setPrimitiveName 自动实现中再次提取标量。似乎每次获取或设置都不必要地来回编组。

【讨论】:

以上是关于Objective-C 错误:属性“活动”是类“例程”上的标量类型。无法为其生成 getter 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在objective-c中使对象在整个应用程序中保持活动状态

数据隐藏和 Objective-C 合成器 [重复]

iOS:Objective-C 创建类属性错误:使用未声明的标识符

Objective-C 类方法:点语法和​​“类属性”

Objective-C:改变自身属性的递归方法

单例模式