1

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

「Venus」と「Mars」はMagicalRecordを使って作成しています。私のView Controllerでは、ラベルとボタンを使用して上記をテストしています。テストによると、私が火星を「訪問」すると、金星も訪問されるようになります。ivar VisitedByHumans を Core-Data 以外のプロパティに切り替えると、期待どおりに動作します。だから私はもう「立ち往生」していませんが、ivar のことを理解したいと思っています。

4

2 に答える 2

2

vistedByHumansは実際には ivar ではなく、サブクラスのグローバル変数ですPlanet。そのため、どのインスタンスが実際に訪問されたかに関係なく、すべての「惑星」インスタンスが訪問されたように見えます。それを実際の ivar にしたい場合は、 、、およびのように a@propertyを追加する必要があります(ただし、これら 3 つはもちろんモデル用に生成されたものです)。例えば:@interfacenamediameter_kmmass_kg

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

そしてあなたの実装では:

@synthesize visited=visitedByHumans;

あるいは単に

@synthensize visited;

とにかくこれらのメソッド (visitedおよびsetVisited:) を使用しているように見えるため、実際には に直接アクセスしていませんvisitedByHumans

また、必ずコード行を削除してください

BOOL visitedByHumans;

と 2 つのメソッド定義isVisitedsetVisited:. それらはあなたがそれらをしたときにあなた@synthesizeのために生成されます。

于 2012-05-27T06:41:19.803 に答える
-1

提示された情報に基づいて確認することは不可能です。あなたの説明はコードと一致しません-あなたの言うことにもかかわらずvisitedByHumans、そのコードのインスタンス変数ではないことは間違いありません。これは、コア データをvisitedByHumans. 基本的に、Core Data を使用していたときにコードが正しく機能しなかったことを説明しますが、実際には Core Data を使用していないまったく別のコードを提示します。このプロパティに Core Data を使用しようとしたときに何をしていたのかわかりません。そのため、何が間違っていたのかわかりません。その時点で の宣言がvisitedByHumansコードに含まれていた場合、ほぼ確実に問題が発生していました。同じく、superの実装では、悪い結果が得られます。ただし、Core Data コードが機能しない理由を知りたい場合は、まったく別のコードではなく、そのコードを貼り付けてください。あなたが助けを求めるとき、あなたが何をしているのかを人々に推測させないでください。

于 2012-05-28T04:31:12.327 に答える