我见过的所有类别示例都使用了一些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
有办法做到这一点吗?
答案 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