不务正业之OC(九)–类目

不务正业之OC(九)–类目

因为OC中不支持多重继承,对于需要增加方法,就比较麻烦,所以有了类目。

介绍:
1、类目定义的方法,成为原始类的一部分,调用没有区别
2、父类定义的类目,子类可以继承

作用:
1、对现在有类进行扩展
2、子类代替手段
3、类中方法归类(可以定义到多个文件中去)

局限:
1、不能添加实例变量
2、建议不要cover原始类的中方法,类目方法具有最高优先级

介绍两种类目实现
1、把类目定义和类定义放在一起
2、类目定义放在单独的文件

第一种方式:

//  Child.h
//  Catagory
 
 
#import <Foundation/Foundation.h>
 
@interface Child : NSObject
{
    NSString *_name;
    int _age;
}
@property (nonatomic,retain) NSString* _name;
@property (nonatomic,assign) int _age;
//类中方法
- (void) cry;
 
@end
//类目定义,Creation为类目名。规则:类名 (类目名)
@interface Child (Creation)
 
- (id) initWithName:(NSString *) name setAge:(int) age;
 
@end
//再定义一个类目Grow
@interface Child(Grow)
 
- (void) eat;
 
@end
 
//  Child.m
//  Catagory
 
#import "Child.h"
 
@implementation Child
 
@synthesize _name;
@synthesize _age;
 
- (void) cry{
    NSLog(@"child is crying!");
}
 
@end
 
@implementation Child (Creation)
 
- (id) initWithName:(NSString *) name setAge:(int) age{
    self._name = name;
    //一定要release,因为是以retain创建的
    [name release];
    self._age = age;
    return self;
}
 
@end
 
@implementation Child(Grow)
 
- (void) eat{
    NSLog(@"child want to eat!");
}
 
@end
 
 
//  main.m
//  Catagory
 
#import <Foundation/Foundation.h>
#import "Child.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        NSString *name = [NSString stringWithFormat:@"liyi"];
        Child *child = [[Child alloc] initWithName:name setAge:1];
        [child cry];//实例方法调用
        NSLog(@"My son name is:%@,age is %d",child._name,child._age);//类目方法调用
        [child eat];//类目方法调用
    }
    return 0;
}

结果:

2014-05-02 22:35:45.250 Catagory[15168:303] child is crying!
2014-05-02 22:35:45.252 Catagory[15168:303] My son name is:liyi,age is 1
2014-05-02 22:35:45.252 Catagory[15168:303] child want to eat!

第二种方式:
因为在Xcode就有类目创建选项,非常方便
1


Post a Comment