2012-01-26 2 views
2

Objective-C의 범주를 사용하여 서브 클래 싱 할 필요없이 클래스에 메서드를 추가 할 수 있다는 것을 알고 있습니다. 또한이 카테고리는 클래스에 인스턴스 변수를 추가하는 데 사용할 수 없다는 것을 알고 있습니다.NSData에 인스턴스 변수 추가

인스턴스 변수를 추가하는 데 사용할 수있는 클래스 확장에 대해 약간 읽었지만 클래스 확장을 사용하여 NSData와 같은 기존 클래스를 수정하는 방법을 이해할 수 없습니다.

나는 NSURL하고있는 NSData를 포함하는 코어 데이터 모델을 가지고

내 문제는 다음과 같다. NSData는 NSURL에 대한 데이터를 표시합니다. 보기에서 데이터를 표시해야하는 경우 다음 확인을 수행합니다. --- [NSData bytes]> 0 인 경우 NSData를 표시합니다. --- 그렇지 않으면 NSURL에서 데이터를 가져 와서 반환 할 때 데이터를 표시합니다.

충분히 간단합니다. 그러나 NSURL이 업데이트되면 문제가 발생합니다. 그래서, [NSData bytes]가 이미 0보다 크기 때문에 새 이미지로 NSURL 경로를 수정하면 새 이미지를 가져 오기 위해 추가 호출을하지 않습니다.

내가하고 싶은 것은 URL 변수라는 NSData에 인스턴스 변수를 추가하여 데이터의 출처에 대한 정보를 보유하고 싶습니다. CoreData를 사용하기 때문에 NSData를 서브 클래스로 만들 수 없습니다.

누구나 간단한 해결책을 알고 있습니까? 아마도 클래스 확장에 대한 이해에 차이가 있거나 아마도 간단한 방법이 없을 수도 있습니다.

+0

NSData와 NSURL을 모두 알고있는 관리 객체에서 체크인을 수행 할 수 없습니까? –

+0

할 수는 있지만이 기능을 추상화하여 특정 모델에 종속되지 않도록하고 싶습니다. –

답변

2

클래스 확장은 ivars 및 헤더 파일에서 숨겨진 일부 속성을 유지하는 방법으로 구현하는 클래스에 사용해야하며 클래스 외부에 표시되어야하는 항목 만 포함해야합니다 (그리고 ivars는 그런 종류가 아닙니다). 물건).

카테고리는 이미 구현 된 클래스에서 추가 기능을 추가하는 방식으로 사용됩니다. 일반적으로 알려진 클래스에 일반적인 종류의 비헤이비어를 추가하려는 경우에 필요합니다. 예 : 메서드를 NSString에 추가 + (NSString *) reversedString; 반대의 인스턴스를 반환 그래서 당신은 다음과 같이 사용할 수 있습니다 :

NSString *someString = @"string"; 
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts" 

합니다.

귀하의 특정 문제에 관해서는 귀하의 CoreDataModel에 NSURL 또는 NSData가 포함되어 있지 않음을 알려드립니다. 지원되는 유형은 프리미티브, 문자열, 바이너리 데이터 및 변환 가능 항목입니다. 따라서 원하는 경우 NSData 또는 NSURL의 하위 클래스를 만든 다음 해당 유형을 "변환 가능"으로 설정하여 CoreData와 함께 사용할 수 있습니다. 그리고이 작업을 마친 후에는 원하는대로 NSData를 서브 클래스화할 수 있으며, 프로세스에서 클래스 확장을 사용하거나 카테고리를 사용하여 클래스에 필요한 메소드를 추가 할 수 있습니다. 애플

견적에 대한 변형 가능한 속성 :

변형 가능한 속성 뒤에 아이디어는 비표준 형태로 속성에 액세스하지만, 뒤에서 코어 데이터 인스턴스를 사용한다는 것입니다

NSValueTransformer를 사용하여 속성을 사이에서 변환하고 NSData의 인스턴스를 변환합니다. 그런 다음 Core Data는 데이터 인스턴스를 영구 저장소에 저장합니다.

+0

이것은 분명히 그것에 대한 올바른 길입니다. 그러나 NSData를 클래스 클러스터에 서브 클래 싱하는 데 몇 가지 문제가있었습니다. 그래서, 방금 NSData 속성과 키를 모두 가진 별도의 클래스를 만들고 그런 식으로 구현했습니다. –