文档章节

IOS 高级语法与设计模式5(5.1 类目的基本概念与用法)

moki_oschina
 moki_oschina
发布于 2014/08/05 15:56
字数 855
阅读 26
收藏 0

一 、类目的基本概念

    封装是面向对象的一个特征,OC也不例外。但是有的时候我们会遇到这样一种情况,比如封装一个类,不想再动他了。可是随着程序的增加,需要在那个类中增加一个小小的方法。这时我们不必再在这个类中做修改,或者定义一个子类。只需要在用到那个方法时,随手添加一个类目即可。

    1)在类目定义的方法会成为原始类的一部分,与其他方法的调用没有任何区别;

    2)通过给父类定义类目方法,其子类也会继承这些方法。如果子类添加类目方法,父类不会继承子类的类目方法。

二、类目方法的应用

    1)对现有类进行扩展。比如你可以扩展Cocoa touch框架中的类,你在类目中增加的方法会被子类所继承,而且在运行时跟其他方法没有区别。

    2)作为子类的继承手段不需要定义一个子类,你可以通过类目直接给已有类增加方法。

    3)对类中的方法归类,利用category把一个庞大的类划分成小块来分别进行开发。从而更好的对类进行更新和维护。

三、类目方法的局限性

    1)无法向类目中添加新的实例变量。类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过子类来实现。

    2)如若,在类目中覆盖现有类的方法。这样会引起super的消息断裂,因为类目中的方法具有更高的优先级。因此,一般不要覆盖现有类的方法。

四、类目的命名与用法

    类目的命名规则:类名+扩展方法,如"NSString+Revert"

    类目的接口声明与类的定义方法类似,但类目不继承父类,只需要带有一个括号,表明该类的主要用途。

#import <Foundation/Foundataion.h>
//.h 类目的定义
@interface NSString (Revert)
- (void)test;
@end
#import <Foundation/Foundataion.h>
//.m 类的定义
@interface Revert:NSObject 
- (void)test;
@end
#import "NSString+Revert.h"
//.h 类目方法的实现
@implementation NSString (Revert)
- (void)test;
@end
#import "Revert.h"
//.m 类中方法的实现
@implementation NSString (Revert)
- (void)test;
@end

五、相关代码如下:

//
//  person.h
//  Category
//
//  Created by moki on 14-8-4.
//  Copyright (c) 2014年 Santai. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface person : NSObject
{
@private
    NSString *_name;
    int _age;
}
@property (nonatomic,copy) NSString *name;
@property(nonatomic) int age;

- (void)test;
- (void)eat;
@end

@interface person (creation)
+ (id)personWithName:(NSString *)aName;
+ (id)personWithName:(NSString *)aName withAge:(int)age;
//...
- (id)initWithname:(NSString*)aName;
- (id)initWithname:(NSString *)aName withAge:(int)age;
@end

@interface person (life)
//- (void)eat;
- (void)sleep;
- (void)play;
@end
//
//  person.m
//  Category
//
//  Created by moki on 14-8-4.
//  Copyright (c) 2014年 Santai. All rights reserved.
//

#import "person.h"

@implementation person

@synthesize name=_name;
@synthesize age=_age;
- (void)test
{
    NSLog(@"这是类的一个方法");
}
- (void)eat
{
    NSLog(@"他在吃");
}
@end

@implementation person (creation)

+ (id)personWithName:(NSString *)aName
{
    person *pson = [[person alloc] init];
    pson.name = aName;
    return pson;
    
}
+ (id)personWithName:(NSString *)aName withAge:(int)age
{
    person *pson = [[person alloc] init];
    pson.name = aName;
    pson.age=age;
    return pson;
}

- (id)initWithname:(NSString*)aName
{
    self=[super init];
    if(self)
    {
        self.name=aName;
    }
    return self;
    
}
- (id)initWithname:(NSString *)aName withAge:(int)age
{
    self=[super init];
    if(self)
    {
        self.name=aName;
        self.age=age;
    }
    return self;
    
}

@end

@implementation person (life)
/*- (void)eat
{
    NSLog(@"这是类目的eat方法");
}*/
- (void)sleep
{
    NSLog(@"这是类目的sleep方法");
}
- (void)play
{
    NSLog(@"这是类目的play方法");
}


@end

                                                   




© 著作权归作者所有

moki_oschina
粉丝 26
博文 202
码字总数 44864
作品 0
成都
程序员
私信 提问
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
2018/05/26
0
0
移动开发之设计模式- 代理模式(IOS&Android)

资源 完全参照 代理模式|菜鸟教程但不包括IOS代码 代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有...

FlanneryZJ
2018/12/18
0
0
移动开发之设计模式- 装饰器模式(IOS&Android)

资源 完全参照 装饰器模式|菜鸟教程 ,但不包括IOS代码 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模...

FlanneryZJ
2018/12/20
0
0
移动开发之设计模式-工厂模式(IOS&Android)

资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳...

FlanneryZJ
2018/12/17
0
0
总结一些IOS的面试题吧~不定期更新~附带个人理解的“参考”答案哈

除了MVC模式 你还熟悉什么设计模式 代理模式:当一个类的某些功能需要由别的类实现,但是又不确定具体是哪个类实现的 单例模式:当确保程序运行期间,某个类只有一份实例,用于进行资源共享 ...

RainOrz
2015/08/18
52
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
4
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
989
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部