Подкласс NSManagedObject соответствует протоколу <MKAnnotation>? - PullRequest
2 голосов
/ 20 июля 2010

Моя основная проблема заключается в хранении данных, которые не поддерживаются 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 является необязательным, но он мне нужен, если я хочу, чтобы аннотация перетаскивалась)

В базовых данных свойство Location может быть преобразовано.и я использую @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

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Вы можете заставить подкласс 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];
}
1 голос
/ 20 июля 2010

Было бы хорошо узнать, где вы получаете ошибки EXC_BAD_ACCESS, однако вот пара идей. Во-первых, предполагая, что существует внешний класс, который хочет вызвать setCoordinate:, вам действительно следует изменить @property на список coordinate как readwrite, поскольку вы рассказываете миру, что им не разрешено изменять это значение. Другая вещь, которую вы могли бы попробовать, это пойти дальше и фактически отправить coordinate в setCoordinate:, тогда вы можете исключить свой собственный метод coordinate и позволить Core Data написать вам более быстрый.

...