【问题标题】:NSManagedObject subclass conform to the <MKAnnotation> protocol?NSManagedObject 子类是否符合 <MKAnnotation> 协议?
【发布时间】:2010-07-20 02:59:00
【问题描述】:

我的主要问题是存储 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

【问题讨论】:

  • 你真的应该提供更多细节,除非你只是问你是否可以应用协议。
  • 编辑了更多细节。感谢您的帮助

标签: iphone core-data mkannotation


【解决方案1】:

您可以使 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];
}

【讨论】:

    【解决方案2】:

    很高兴知道您在哪里得到 EXC_BAD_ACCESS 错误,但是这里有一些想法。首先,假设有一个外部类想要调用setCoordinate:,您应该真正更改@property 以将coordinate 列为readwrite,因为您正在向世界传达他们不允许更改此值。您可以尝试的另一件事是继续在setCoordinate: 中实际发送coordinate,然后您可以消除您的自定义coordinate 方法并让Core Data 为您编写一个更快的方法。

    【讨论】:

    • 我有只读的,因为Apple Docs说它必须是developer.apple.com/iphone/library/documentation/MapKit/…,我相信核心数据需要你在属性是瞬态的时候自己实现访问器。 (如果我错了,请纠正我)看起来我在当前的实现中错过了一些关于 KVC 的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多