У меня есть очень простой пример, когда я читаю некоторые данные в классе из JSON, и мои объекты каким-то образом повреждаются. Я подозреваю, что мне не хватает деталей о том, как работают свойства/ARC, но я не уверен, что это такое или как я его отслеживаю.Почему мои объекты неожиданно меняются?
Я сократил свой первоначальный код, так что проблема очевидна. Однако это означает, что неясно, почему я использую пользовательские свойства и т. Д. - мой реальный код имеет больше функциональности ...
Проблема может быть видна в последней строке файла Test.m. Первый построенный объект теперь содержит данные из второго объекта, а не значение, которое оно изначально содержало.
Любые советы о том, что я делаю неправильно и/или как отследить этот вопрос, были бы весьма признательны.
ANBNote.h
@interface ANBNote : NSObject
@property (nonatomic,readwrite) NSArray* references;
- (id)initWithJson:(NSDictionary*)data;
@end
ANBNote.m
#import "ANBNote.h"
@implementation ANBNote
NSArray * _references;
-(id) init {
if(!(self=[super init])) return nil;
[email protected][];
return self;
}
-(id)initWithJson:(NSDictionary *)jsonObject {
if(!(self = [self init])) { return nil; }
_references = jsonObject[@"references"];
return self;
}
-(void) setReferences:(NSArray *)references {
_references = references;
}
-(NSArray *)references {
return _references;
}
@end
Test.m
...
NSDictionary * d1 = @{@"references":@[@"r1",@"r2"]};
NSDictionary * d2 = @{@"references":@[@"q1",@"q2"]};
ANBNote * n1 = [[ANBNote alloc] initWithJson:d1];
NSLog(@"R1 = %p, %@", n1.references, n1.references); // Prints r1, r2 - as expected
ANBNote * n2 = [[ANBNote alloc] initWithJson:d2];
NSLog(@"R2 = %p, %@", n2.references, n2.references); // Prints q1, q2 - as expected
NSLog(@"R1 = %p, %@", n1.references, n1.references); // Prints q1, q2 - Oh No!
Обратите внимание, что если удалить корка om ссылается на функции свойств и полагается на сгенерированную версию компилятора, все, кажется, ведет себя правильно.
Проблема с глобальными vs ivars находится на месте, и добавление ее в качестве ivar с использованием '{}' отлично работает. Но если я удалю определение ivar, я теперь получаю «Использование незаявленных идентифицированных« _references »... –
Ваш компилятор не должен поддерживать автоматический синтез. В зависимости от его точной версии вы можете выполнять только «ссылки @synthesize», чтобы иметь ivar, созданный с помощью подчеркивания, или (если он достаточно старый), вам действительно придется объявить ivar отдельно, а затем соединить их с '@synthesize references = _references;' –
В этом случае вы не можете опустить ivar: из http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html " Примечание. ... Если вы реализуете как getter, так и setter для свойства readwrite или getter для свойства readonly, компилятор будет считать, что вы берете контроль над реализацией свойства и не будете автоматически синтезировать переменную экземпляра. Если вам все еще нужна переменная экземпляра, вам необходимо запросить ее синтез: '@synthesize property = _property;' " –