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中使对象在整个应用程序中保持活动状态