Переменная экземпляра в классе NSManagedObject действует как переменная класса?

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

Я использую MagicalRecord для создания "Венеры" и "Марса". В моем контроллере представления я использую метки и кнопки, чтобы проверить вышеупомянутое. Тестирование показывает, что когда я "посещаю" Марс, Венера также становится посещаемой. Если я переключу ivar visitByHumans в свойство не-Core-Data, оно будет работать как положено. Так что я больше не "застрял", но я хочу понять, что такое ивар.

2 ответа

Решение

vistedByHumans на самом деле это не ivar, а глобальная переменная вашего подкласса Planet, Таким образом, любой экземпляр "планеты" будет посещаться независимо от того, какой экземпляр действительно посещен. Если вы хотите, чтобы это был настоящий ивар, вам нужно добавить @property на ваш @interface так же, как name, diameter_km, а также mass_kg (хотя эти три, конечно, были созданы для ваших моделей). например:

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

и в вашей реализации:

@synthesize visited=visitedByHumans;

или просто

@synthensize visited;

Поскольку вы, кажется, используете эти методы (visited а также setVisited:) во всяком случае, и не совсем прямой доступ visitedByHumans,

Также обязательно удалите строку кода

BOOL visitedByHumans;

и два определения метода isVisited а также setVisited:, Они будут созданы для вас, когда вы @synthesizeсделал их.

Невозможно быть уверенным, основываясь на информации, которую вы представили. Ваше описание не соответствует коду - несмотря на то, что вы говорите, visitedByHumans это определенно не переменная экземпляра в этом коде. Это заставляет меня задуматься о том, как выглядел код, прежде чем вы отказались от использования Core Data для visitedByHumans, По сути, вы объясняете, что код не работал правильно, когда вы использовали Core Data, но затем представляете совершенно другой код, который фактически не использует Core Data. Я не знаю, что вы делали, когда пытались использовать базовые данные для этого свойства, поэтому я не могу сказать, что вы, возможно, делали неправильно. Если это заявление visitedByHumans в то время был в коде, он почти наверняка все испортил. Аналогично, если в подклассе управляемого объекта были сеттеры, которые не вызывали superРеализация, вы получите плохие результаты. Но если вы хотите знать, почему ваш код Core Data не работал, вставьте этот код, а не какой-то совершенно другой код. Не заставляйте людей угадывать, что вы делаете, когда обращаетесь за помощью.

Другие вопросы по тегам