Переменная экземпляра в классе 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 не работал, вставьте этот код, а не какой-то совершенно другой код. Не заставляйте людей угадывать, что вы делаете, когда обращаетесь за помощью.