可以仅在Objective-C类上创建类别吗?

时间:2009-04-05 18:21:38

标签: objective-c

我见过的所有类别示例都使用了一些Objective-C类而不是自定义类。例如:NSMutableArray,NSArray,NSString。我想为自定义类创建一个类别。这是我创建的一个无用的例子,只是为了测试但是编译失败:

//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

类别定义:

@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

这将给出以下错误和警告:

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

您定义的自定义Objective-C类仍然是Objective-C类。您可以在它们上创建类别,是的。这里的问题是你写的东西不是远程定义类别的正确方法。

首先定义一个普通类。您可以将所有实例变量和所需的任何方法放在那里。

然后定义一个类别,它将方法添加到它所在的类中。类别不是来自任何父类或具有ivars,因为它们只是将方法添加到现有类。

有关完整文档,请参阅Apple的The Objective-C Programming Language

答案 1 :(得分: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