1

仅限 IOS 5,带有 ARC。在我的核心数据模型类中:

//  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 创建“Venus”和“Mars”。在我的视图控制器中,我使用标签和按钮来测试上述内容。测试表明,当我“访问”火星时,金星也会被访问。如果我将 ivarvisitedByHumans 切换为非核心数据属性,它会按预期工作。所以我不再“卡住”,但我想了解 ivar 的事情。

4

2 回答 2

2

vistedByHumans实际上不是 ivar,而是子类的全局变量Planet。因此,无论实际访问哪个实例,似乎都会访问任何和每个“行星”实例。如果你想让它成为一个真正的 ivar,你需要在@property@interface喜欢name的 、diameter_km和中添加一个mass_kg(尽管这三个当然是为你的模型生成的)。例如:

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

并在您的实施中:

@synthesize visited=visitedByHumans;

要不就

@synthensize visited;

由于您似乎无论如何都在使用这些方法(visited和),而不是真正直接访问.setVisited:visitedByHumans

另外,请务必删除代码行

BOOL visitedByHumans;

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

于 2012-05-27T06:41:19.803 回答
-1

根据您提供的信息无法确定。您的描述与代码不匹配——尽管您说了什么,visitedByHumans但绝对不是该代码中的实例变量。这让我想知道在您将其从使用 Core Data 转换为visitedByHumans. 基本上,您解释说当您使用 Core Data 时代码无法正常工作,但随后呈现完全不同的代码,实际上并没有使用 Core Data。我不知道当您尝试将 Core Data 用于此属性时您在做什么,所以我无法判断您可能做错了什么。如果那个声明visitedByHumans当时在代码中,那几乎可以肯定你把事情搞砸了。同样地,super的实施,你会得到不好的结果。但是,如果您想知道为什么您的 Core Data 代码不起作用,请粘贴代码,而不是一些完全不同的代码。当你寻求帮助时,不要让人们猜测你在做什么。

于 2012-05-28T04:31:12.327 回答