仅限IOS 5,使用ARC。在我的Core Data模型类中:
// Planet.h //
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Planet : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSNumber *diameter_km;
@property (nonatomic, retain) NSNumber *mass_kg;
-(void) setVisited:(BOOL)flag;
-(BOOL) isVisited;
@end
// Planet.m //
//#import "Planet.h"
@implementation Planet
@dynamic name;
@dynamic diameter_km;
@dynamic mass_kg;
BOOL visitedByHumans; // not a core data entity; just an ivar
-(void)setVisited:(BOOL)flag {
visitedByHumans = flag;
}
-(BOOL)isVisited {
return visitedByHumans;
}
@end
我用MagicalRecord制作“维纳斯”和“火星”。在我的视图控制器中,我使用标签和按钮来测试上面的内容。测试表明,当我“访问”火星时,金星也会被访问。如果我将ivar visitedByHumans切换为非Core-Data属性,它将按预期工作。所以我不再“陷入困境”,但我想了解伊达的事情。
答案 0 :(得分:2)
vistedByHumans
实际上不是ivar,而是您的子类Planet
的全局变量。因此,无论实际访问的是哪个实例,任何和每个“星球”实例都将被访问。如果您想将其设为实际的ivar,则需要向@property
添加@interface
,例如name
,diameter_km
和mass_kg
(尽管如此,这三个当然是为你的模型生成的)。 e.g:
@property (nonatomic,assign,getter=isVisited) BOOL visited;
并在您的实施中:
@synthesize visited=visitedByHumans;
或只是
@synthensize visited;
由于您似乎无论如何都在使用这些方法(visited
和setVisited:
),而且并非真正直接访问visitedByHumans
。
另外,请务必删除代码行
BOOL visitedByHumans;
以及两个方法定义isVisited
和setVisited:
。当您@synthesize
'时,它们将为您生成。
答案 1 :(得分:-1)
根据您提供的信息无法确定。您的描述与代码不匹配 - 尽管您所说,visitedByHumans
绝对不是该代码中的实例变量。然后,这让我想知道在将代码转换为使用visitedByHumans
的核心数据之前代码的样子。基本上,您解释说当您使用Core Data时代码不能正常工作,但是然后呈现完全不同的代码,而这些代码实际上并不使用Core Data。当你试图将Core Data用于这个属性时,我不知道你在做什么,所以我不知道你可能做错了什么。如果当时代码中有visitedByHumans
的声明,那几乎肯定会为你搞清楚。同样,如果您在托管对象子类中设置了未调用super
实现的setter,则会得到错误的结果。但是,如果您想知道为什么您的Core Data代码无效,粘贴那个代码,而不是一些完全不同的代码。当你寻求帮助时,不要让人猜到你在做什么。