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

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!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值