2

私の主な問題は、Core Data でサポートされていないデータを保存することです。変換可能な属性として保存されている CLLocation プロパティが既にあります。正しいアプローチは、一時的な座標プロパティを宣言することだと思います。ただし、EXC_BAD_ACCESS エラーが発生し続けます。

編集:

私の現在のサブクラスには、次のインターフェースがあります。

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface Event : NSManagedObject {

}

@property (nonatomic, retain) NSString* title;
@property (nonatomic, retain) NSDate* timeStamp;
@property (nonatomic, retain) CLLocation *location;

@end

だから私は追加する必要があります

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;

プロトコルに準拠します。(setCoordinate はオプションですが、注釈をドラッグ可能にしたい場合は必要です)

コア データでは、場所のプロパティは変換可能です。また、実装で @dynamic を使用してアクセサーを生成します。コード全体でこのプロパティを使用しているため、これを保持したくありません。

コアデータの座標プロパティを一時的なものとして定義するのが最善の方法だと思いますが、実装に間違いはありません。

- (CLLocationCoordinate2D)coordinate {
    CLLocationCoordinate2D cor = CLLocationCoordinate2DMake(self.location.coordinate.latitude,
    self.location.coordinate.longitude);
    return cor;
}

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    CLLocation *newLoc = [[CLLocation alloc] initWithLatitude:newCoordinate.latitude
    longitude:newCoordinate.longitude];
    [self.location release];
    self.location = newLoc;
} 

いくつかの方法を試しましたが、これが最新の方法です。

編集 2: の EXC_BAD_ACCESS:

_kvcPropertysPrimitiveSetters
4

2 に答える 2

3

NSManagedObject サブクラスは、プロトコルがインスタンスのコンテキストの管理を何らかの形でオーバーライドしない限り、任意のプロトコルに準拠させることができます。MKAnnotation プロトコルは完全に安全なはずです。

アップデート:

あなたの問題はおそらくここにあります:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    CLLocation *newLoc = [[CLLocation alloc] initWithLatitude:newCoordinate.latitude
                                                    longitude:newCoordinate.longitude];
    [self.location release]; //<-- Don't release properties!
    self.location = newLoc;
}

ジェネレーターのアクセサーが保持を処理します。それらを直接リリースすると、その管理が台無しになります。あなたも漏れていnewLocます。試す:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    CLLocation *newLoc = [[CLLocation alloc] initWithLatitude:newCoordinate.latitude
                                                    longitude:newCoordinate.longitude];
    self.location = newLoc;
    [newLoc release];
}
于 2010-07-20T14:20:28.207 に答える
1

EXC_BAD_ACCESS エラーが発生している場所を知っておくとよいでしょうが、いくつかのアイデアがあります。まず、呼び出したい外部クラスがあると仮定すると、setCoordinate:実際に@propertyto リストcoordinateを変更する必要readwriteがあります。世界に電話をかけているため、この値を変更することは許可されていません。他に試すことができるのは、先に進んで実際に送信coordinateしてsetCoordinate:から、カスタム メソッドを削除coordinateし、Core Data がより高速なメソッドを作成できるようにすることです。

于 2010-07-20T19:26:20.947 に答える