NSManagedObject类中的实例变量就像一个类变量?

时间:2012-05-27 02:32:46

标签: nsmanagedobject ivar

仅限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属性,它将按预期工作。所以我不再“陷入困境”,但我想了解伊达的事情。

2 个答案:

答案 0 :(得分:2)

vistedByHumans实际上不是ivar,而是您的子类Planet的全局变量。因此,无论实际访问的是哪个实例,任何和每个“星球”实例都将被访问。如果您想将其设为实际的ivar,则需要向@property添加@interface,例如namediameter_kmmass_kg(尽管如此,这三个当然是为你的模型生成的)。 e.g:

@property (nonatomic,assign,getter=isVisited) BOOL visited;

并在您的实施中:

@synthesize visited=visitedByHumans;

或只是

@synthensize visited;

由于您似乎无论如何都在使用这些方法(visitedsetVisited:),而且并非真正直接访问visitedByHumans

另外,请务必删除代码行

BOOL visitedByHumans;

以及两个方法定义isVisitedsetVisited:。当您@synthesize'时,它们将为您生成。

答案 1 :(得分:-1)

根据您提供的信息无法确定。您的描述与代码不匹配 - 尽管您所说,visitedByHumans绝对不是该代码中的实例变量。然后,这让我想知道在将代码转换为使用visitedByHumans的核心数据之前代码的样子。基本上,您解释说当您使用Core Data时代码不能正常工作,但是然后呈现完全不同的代码,而这些代码实际上并不使用Core Data。当你试图将Core Data用于这个属性时,我不知道你在做什么,所以我不知道你可能做错了什么。如果当时代码中有visitedByHumans的声明,那几乎肯定会为你搞清楚。同样,如果您在托管对象子类中设置了未调用super实现的setter,则会得到错误的结果。但是,如果您想知道为什么您的Core Data代码无效,粘贴那个代码,而不是一些完全不同的代码。当你寻求帮助时,不要让人猜到你在做什么。

相关问题