JSON에서 클래스로 일부 데이터를 읽는 아주 기본적인 예제가 있는데 내 오브젝트가 어떻게 든 손상됩니다. 나는 속성/ARC가 어떻게 작동하는지에 대한 세부 사항을 놓치고 있다고 생각하지만, 그것이 무엇인지, 또는 그것을 추적 할 방법이 확실하지 않다.내 개체가 예기치 않게 변경되는 이유는 무엇입니까?
문제가 분명하도록 원본 코드가 축소되었습니다. 그러나 이것은 왜 내가 사용자 정의 속성 등을 사용하고 있는지 명확하지 않다는 것을 의미합니다. 실제 코드에 더 많은 기능이 있습니다.
문제는 Test.m 파일의 마지막 줄에서 볼 수 있습니다. 첫 x 째 구성된 오브젝트에는 원래 포함 된 값이 아닌 두 x 째 오브젝트의 데이터가 포함됩니다.
내가 뭘 잘못하고 있는지에 대한 조언이나이 문제를 추적하는 방법에 대한 조언은 크게 감사하겠습니다.
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!
주 내가 CUST를 제거하는 경우 있음 옴은 속성 함수를 참조하고 모든 것이 올바르게 작동하는 것으로 보이는 컴파일러 생성 버전에 의존합니다. 그것은 세계의
@implementation ANBNote
NSArray * _references;
:
글로벌 vs ivars에 관한 문제가 있으며,'{}'을 사용하여 ivar로 추가하는 것이 효과적입니다. 그러나 ivar 정의를 제거하면 선언되지 않은 '_references'를 사용하게됩니다 ... –
컴파일러가 자동 합성을 지원해서는 안됩니다. 정확한 버전에 따라 밑줄로 생성 된 ivar를 갖기 위해'@synthesize references; '를 할 수도 있고 (충분히 오래된 경우) 실제로 ivar을 별도로 선언 한 다음 '@synthesize references = _references;' –
이 경우에는 ivar을 생략 할 수 없습니다. http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html " 참고 : ... readwrite 속성에 getter와 setter를 모두 구현하거나 readonly 속성에 getter를 구현하면 컴파일러는 속성 구현을 제어하고 인스턴스 변수를 자동으로 합성하지 않는다고 가정합니다. 여전히 인스턴스 변수가 필요한 경우 합성 변수를 요청해야합니다. '@synthesize property = _property;' " –