2009-04-05 5 views
1

내가 본 카테고리의 모든 예는 사용자 정의 클래스보다는 일부 Objective-C 클래스를 사용합니다. 예 : NSMutableArray, NSArray, NSString. 맞춤 클래스에 대한 카테고리를 만들고 싶습니다. 여기에 그냥 테스트하기 위해 만들어졌지만 실패 쓸모없는 예제가 편집 :범주를 Objective-C 클래스에서만 만들 수 있습니까?

//person.h 
@interface Person (aCategory) : NSObject { 
NSString *MyName; 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *MyName; 
@end 

//person.m 
#import "Person+aCategory.h" 

@implementation Person 
@synthesize MyName; 
@end 

그리고 범주 정의 :

error: Person+aCategory.h: no such file or directory 
warning: cannot find interface declaration for Person 
error: no declaration of property 'MyName' found in interface 

이 있습니까 :

@interface aCategory : NSObject { 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *webAddress; 
- (void)changeWebAddress; 
@end 

//in aCategory.h 
#import "aCategory.h" 

@implementation aCategory 
@synthesize webAddress; 

- (void) changeWebAddress{ 
self.webAddress = @"http://www.abc.com"; 
} 
@end 

이 다음 오류 및 경고를 줄 것이다 이 일을하는 방법?

답변

3

사용자 정의 Objective-C 클래스는 여전히 Objective-C 클래스입니다. 카테고리를 만들 수 있습니다. 그렇습니다. 문제는 여기에서 쓴 것은 원격으로 카테고리를 정의하는 것이 아니라는 것입니다.

먼저 일반 클래스를 정의합니다. 모든 인스턴스 변수와 원하는 메소드를 그 안에 넣습니다.

그런 다음 카테고리를 정의하면 해당 클래스에 메소드가 추가됩니다. 카테고리는 기존 클래스에 메소드를 추가하기 때문에 상위 클래스 나 하위 클래스에서 파생되지 않습니다.

자세한 내용은 Apple The Objective-C Programming Language을 참조하십시오.

+0

>> 여기서 문제 << 확인 : 주석 다음

,이 코드를 다시 작성하는 방법 중 하나입니다.. 제 예제를 수정할 수 있습니까? – 4thSpace

1

모든 Objective-C 클래스에서 카테고리를 만들 수 있습니다. 대개 NS 클래스에 대한 카테고리를 표시합니다. 대개 클래스를 직접 변경할 수 없기 때문입니다. 이는 클래스에 대한 소스 코드가있는 경우 수행 할 작업입니다.

나는 개인용 메서드에 대해 내 자신의 클래스에 범주를 주로 사용하지만 클래스에 대한 별도의 클래스를 만들지는 않습니다. 단지 .m 파일에 해당 범주의 @interface를 선언합니다.

Here's a link에 범주 사용을 요약 한 답변이 나와 있습니다. 당신이 쓴 것은 원격으로 범주를 정의 할 수있는 올바른 방법으로되지 않는 것입니다

//person.h 
@interface Person : NSObject { 
    NSString *myName; 
    NSString *webAddress; 
} 
@property(nonatomic, copy) NSString *myName; 
@property(nontatomic, copy) NSString *webAddress; 
@end 

//person.m 
#import "Person.h" 

@interface Person (aCategory) 
- (void)changeWebAddress; 
@end 

@implementation Person 
@synthesize myName; 
@synthesize webAddress; 
@end 

@implementation Person (aCategory) 
- (void)changeWebAddress { 
    self.webAddress = @"http://www.abc.com"; 
} 
@end 
+0

링크에서 코드를 적용하려고했지만 여전히 오류가 발생합니다. Person에 대한 인터페이스 선언을 찾을 수 없습니다. – 4thSpace

+0

인터페이스 및 구현 파일을 다시 작성하는 방법을 보여주는 답변을 업데이트했습니다. – Abizern

+0

감사. 카테고리 혜택을 볼 수 없습니다. 사람이 aCategory에서 아무 것도하지 않고 changeWebAddress 메서드를 사용하여 완벽하게 정상적으로 작동 할 수있는 것처럼 보입니다. – 4thSpace

관련 문제