2012-05-02 5 views
2

추가 속성 및 메서드를 포함하려는 UIImage (UIImageExtra) 하위 클래스를 만들었습니다.사용자 지정 개체의 NSArray 저장

이 사용자 지정 클래스의 인스턴스를 포함하는 배열이 있습니다. 그러나 배열을 저장할 때 UIImageExtra 클래스의 추가 데이터가 저장되지 않는 것으로 보입니다.

UIImageExtra는 NSCoding을 준수하지만 추가 한 NSLog 문은 인쇄되지 않으므로 initWithCoder 또는 encodeWithCoder도 호출되지 않습니다.

배열을 저장하는 내 방법은 다음과 같습니다

- (void)saveIllustrations { 
if (_illustrations == nil) { 
    NSLog(@"Nil array"); 
    return; 
} 

[self createDataPath]; 
//Serialize the data and write to disk 
NSString *illustrationsArrayPath = [_docPath stringByAppendingPathComponent:kIllustrationsFile]; 
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:_illustrations forKey:kIllustrationDataKey]; 
[archiver finishEncoding]; 
[data writeToFile:illustrationsArrayPath atomically: YES]; 
} 

을 그리고 UIImageExtra 절약에 대해 다음과 위임 방법이 있습니다 : 첫 번째 장소 외모의 배열을 만들 수

#pragma mark - NSCoding 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    NSLog(@"Encoding origin data!"); 
    [super encodeWithCoder:aCoder]; 
    [aCoder encodeObject:originData forKey:kOriginData]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:(NSCoder *) aDecoder]) { 
     NSLog(@"Decoding origin data"); 
     self.originData = [aDecoder decodeObjectForKey:kOriginData]; 
    } 
    return self; 
} 

내 코드를 이런 경우 (단서를 제공하는 경우)

 for (NSDictionary *illustrationDict in illustrationDicts) { 
     NSString *illustrationString = [illustrationDict objectForKey:@"Filename"]; 
     NSNumber *xCoord = [illustrationDict objectForKey:@"xCoord"]; 
     NSNumber *yCoord = [illustrationDict objectForKey:@"yCoord"]; 
     UIImageExtra *illustration = (UIImageExtra *)[UIImage imageNamed:illustrationString]; 

     //Scale the illustration to size it for different devices 
     UIImageExtra *scaledIllustration = [illustration adjustForResolution]; 
     NSValue *originData = [NSValue valueWithCGPoint:CGPointMake([xCoord intValue], [yCoord intValue])]; 
     [scaledIllustration setOriginData:originData]; 
     [self.illustrations addObject:scaledIllustration]; 
    } 

아니면 그냥 이 데이터를 잘못된 방식으로 보내고 있습니까? 많은 감사합니다.

답변

3

배열을 초기화하는 코드는 실제로 UIImageExtra 서브 클래스의 인스턴스를 생성하지 않습니다.

UIImageExtra *illustration = (UIImageExtra *)[UIImage imageNamed:illustrationString]; 

은 UIImage를 반환합니다. 그것을 주조하는 것은 당신이 원하는 것을하지 않습니다.

UIImageExtra *scaledIllustration = [illustration adjustForResolution]; 

여전히있는 UIImage이다.

이 방법에 접근하는 간단한 방법은 UIImageExtra를 UIImage 주변의 래퍼으로 만드는 것입니다. 의 결과를 재 포장 당신은 또한에 조심 instance-- 랩있는 UIImage에 전달해야 호출 할

+ (UIImageExtra)imageExtraWithUIImage:(UIImage *)image; 

그리고 모든있는 UIImage 방법 : 래퍼가있는 UIImage에서 초기화 클래스 메소드있을 것입니다 예 -adjustForResolution 다시 언 래핑 된 UIImage 인스턴스로 끝나지 않도록하십시오.

더 오브젝티브 C 정교한 접근 방식은있는 UIImage에 카테고리에서 원하는 기능을 추가 한 다음 카테고리의 구현과 NSCoding 방법을 대체 할를 스위 즐링 방법을 사용하는 것입니다. 이러한 까다로운 부분 (필수 Objective-C 런타임 체조 제외)은 범주에서 인스턴스 변수를 추가 할 수 없으므로 "추가"데이터를 저장할 위치입니다. [표준 답변은 포인터 값을 포함하는 NSValue와 같은 UIImage 인스턴스의 적절한 표현으로 키잉 한 룩 어 시드 (look-aside) 사전을 갖는 것이지만, 부기가 복잡해질 수 있다고 생각할 수 있듯이.]

스테핑 백 잠시 동안 새로운 코코아 프로그래머에 대한 조언은 다음과 같을 것입니다. "더 간단한 방법을 생각해보십시오. 당신이하려는 일이 복잡하다면 다른 것을 시도해보십시오." 예를 들어 -image 메서드와 -extraInfo 메서드가 있고 (NSCoding 등을 구현하는) 간단한 ImageValue 클래스를 작성하고 해당 인스턴스를 배열에 저장합니다.

+0

나는 + (UIImageExtra *) imageExtraWithUIImage : (UIImage *) 이미지에 어떤 것이 들어가는 지 잘 모르겠다. UIImage 인수로 무엇을합니까? alloc 및 init 새 UIImageExtra 개체를 만들고 그것을 반환하는 가정 해요하지만 UIImage 해당 새로 할당 된 UIImageExtra 속성으로 설정해야합니까? 어떤 경우 하위 클래스에서 UIImage의 인스턴스를 정의해야합니까? 부모 클래스의 인스턴스를 하위 클래스의 속성으로 가지는 것이 이상한가요? 또는 어떻게 든 부모 클래스를 UIImage의 인스턴스로 설정할 수 있습니까? – Smikey

1

초기화 후 NSArray에 객체를 추가 할 수 없습니다. 문제가 될 수있는 NSMutableArray를 사용하십시오.

관련 문제