!!!Obj-C 2.0 -- Chapter 5 Categories and Extensions

本文深入探讨了如何使用Objective-C中的类别(category)特性向现有类添加方法,包括方法的声明与定义、类别的命名约定、如何在类中使用类别以及类别与扩展的区别。此外,还解释了类别不能添加实例变量,以及如何通过导入文件来实现对特定类的方法扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
@end
For 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!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值