首页 > 移动平台 > 详细

iOS 分类思想(1)

时间:2014-03-26 09:42:21      阅读:524      评论:0      收藏:0      [点我收藏+]

1.需求:如果对一个类在不更改代码的基础上要为它再扩充额外的方法可以使用继承和分类

2.分类

作用:可以在不修改原来类代码的基础上,给某一个类扩充一些对象方法或者类方法,因此一个类可以有多个分类

实现:分类也是类因此也有声明和实现,分类一般以要实现的功能或者模块命名

  • 声明:@interface 类名(分类名称) @end
  • 实现:@implementation 类名(分类名称) @end

3.注意

(1)在分类只能增加方法,不能增加成员变量,如果要增加成员变量的话该考虑用继承去实现

(2)在分类实现方法中可以访问类中的成员变量但是不能访问类中的属性@property

(3)在分类中可以重新实现原类中的方法,但会将原类中的方法覆盖而失效。因为在执行对象成员方法的时候会优先去分类中查找,然后再去原类中去查找,最后去父类   中去查找。但是一般不建议么做!

(4)如果一个类有多个分类,而且分类中有同名的方法那么最后编译的分类会将前面编译的分类覆盖而执行输出

4.总结:

依据分类这一思想:如果一个类中有很多实现功能的方法,那么可以将每一个功能方法单独写成分类,让具体的分类来管理具体的功能!这样的话如果其他类要实现同样功能就可以直接调用分类

在实际开发中一般不建议给自定义的类写分类,一般情况下都是为系统自带的类写分类 

举例:Peron类有两个分类Person+QM 和 Person+MM

bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person.h文件 **********************************/
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _personCount;
}

@property int personCount;

- (void)test;

@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person.m文件 **********************************/
#import "Person.h"

@implementation Person

- (void)test
{
    NSLog(@"执行原类 Person 中的test方法");
}

@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person+QM.h文件 **********************************/
#import "Person.h"

@interface Person (QQ)

- (void)study;

- (void)test;

@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person+QM.m文件 **********************************/

#import "Person+QM.h"

@implementation Person (QQ)
- (void)study
{
    
    NSLog(@"学习");
}

// 将原来Person的test覆盖
- (void)test
{
    NSLog(@"执行分类 Person+QM 中的test方法");
}
@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person+MM.h文件 **********************************/

#import "Person.h"

@interface Person (MM)

- (void)test;

@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** Person+MM.m文件 **********************************/

#import "Person+MM.h"

@implementation Person (MM)
- (void)test
{
    NSLog(@"执行分类 Person+MM.h 中的test方法");
}
@end
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
/*********************** main.m文件 **********************************/
#import <Foundation/Foundation.h>
#import "Person+QM.h"
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *person = [[Person alloc] init];
    
    [person test];
    
    [person study];
    
    return 0;
}
bubuko.com,布布扣
bubuko.com,布布扣

输出:

2014-03-06 14:07:04.281 分类[898:303] 执行分类 Person+QM 中的test方法

2014-03-06 14:07:04.282 分类[898:303] 学习

为什么会输出分类Person+QM中的方法呢,这个和编译顺序有关系

 bubuko.com,布布扣

iOS 分类思想(1),布布扣,bubuko.com

iOS 分类思想(1)

原文:http://www.cnblogs.com/sxd0376/p/3622543.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!