A category allows you to add methods to an existing class -- even to one to which you don't have the source.
5.1 Adding Methods to Classes
You can add methods to a class by declaring them in an interface file under a category name and defining them in an implementation file under the same name. The category name indicates that the methods are additions to a class declared elsewhere, not a new
class.
You cannot use a category to add additional instance variables to a class.
The methods the category adds to the class are inherited by all the class's subclasses, just like other methods.
The declaration of a category interface looks similar to a class declaration -- except the category name is listed within parentheses after the class name and the superclass isn't mentioned. Unless its methods don't access any instance variables of the class, the category must import the interface file for the class it extend:
#import "ClassName.h"
@interface ClassName ( CategoryName )
// method declarations
@endFor Category files, a common naming convention is that the base file name of the category is the name of the class the category extends followed by "+" followed by the name of the category: (ClassName+CategoryName.m):
#import "ClassName+CategoryName.h"
@implementation ClassNmae ( CategoryName )
// method definitions
@end
All instance variables within the scope of the class are also within the scope of the category. That includes all instance variables declared by the class, even ones declared @private.5.2 How you Use Categories
Although the language currently allows you to use a category to override methods the class inherits, or even methods declared in the class interface, you are strongly discouraged from using this functionality.
5.4 Extensions
Class extensions are like "anonymous" categories, except that the methods they declare must be implemented in the main @implementation block for the corresponding class.
It is common for a class to have a publicly declared API and to then have additional API declared privately for use solely by the class or the framework within which the class resides (E.G. readwrite/readonly property attributes).
// Category implementation, can compile successfully
@interface MyObject : NSObject
{
NSNumber *number;
}
- (NSNumber *) number;
@end
@interface MyObject (Setter) // category
- (void)setNumber: (NSNumber *)newNumber;
@end
@implementation MyObject
-( NSNumber *) number {
return number;
}
@end
This is no implementation of the setNumber: method, if it's invoked, it will generate error.
// Category implementation, can compile successfully
@interface MyObject : NSObject
{
NSNumber *number;
}
- (NSNumber *) number;
@end
@interface MyObject () // extension
- (void)setNumber: (NSNumber *)newNumber;
@end
@implementation MyObject
-( NSNumber *) number {
return number;
}
-(void)setNumber:(NSNumber *)newNumber{
number = newNumber;
}
@end
This is no implementation of the setNumber: method, if it's invoked, it will generate error.
Note:
1. No name is given in theparentheses in the second @interface block.
2. The implementation of thesetNumber: method appears within the main @implementation block for the class.
For one class, we canhave multiple categories, but we can only have one extension.
Extension can addinstance variable and override property!
本文深入探讨了如何使用Objective-C中的类别(category)特性向现有类添加方法,包括方法的声明与定义、类别的命名约定、如何在类中使用类别以及类别与扩展的区别。此外,还解释了类别不能添加实例变量,以及如何通过导入文件来实现对特定类的方法扩展。
409

被折叠的 条评论
为什么被折叠?



