Objective-C 12 Category

Category

OC提供了一种与众不同的方式——可以动态的为已经存在的类添加新的行为(方法)。

这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。

并且使用Category对类进行扩展时,不需要创建子类。

Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。

可以喂任何类添加新的方法,包括那些没有源代码到类。

习惯将类别代码放在独立的文件中,通常以“类名称+类别名称”的风格命名。

现在我们为NSString类添加一个类别hello。步奏如下图:

1 File-New-New File,或者按Command+N快捷键,弹出下图。

2 选择Objective-C File,点击Next。弹出下图:

3 填写类别名称Hello,选择文件类型为Category,Class填写给哪个类添加类别。

这样后会创建两个文件:NSString+Hello.h和NSString+Hello.m。

NSString+Hello.h

#import <Foundation/Foundation.h>

@interface NSString (Hello)
-(void)haha;
@end

NSString+Hello.m

#import "NSString+Hello.h"

@implementation NSString (Hello)
-(void)haha{
    NSLog(@"NSString haha");
}
@end

在使用的地方需要导入类别的头文件

#import <Foundation/Foundation.h>
#import "NSString+Hello.h"
typedef int (^MySum)(int, int);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str = @"abcdef";
        [str haha];
    }
    return 0;
}

输出结果为:

2016-08-11 17:42:25.622 命令行工程[6126:275845] NSString haha

可以为任何类添加任意数量的类别,当然要保证类别名称唯一。

缺陷:

1 类别中无法添加新的实例变量,可以添加属性。

2 名称冲突:类别中的方法与现有方法重名,此时类别具有更高的优先级。

时间: 2024-11-07 10:13:26

Objective-C 12 Category的相关文章

android中广播的使用

广播消息机制用于进行系统级别的消息通知,每个应用程序可以对感兴趣的广播进行注册,并且将接收广播的方法定义在广播接收器中(Broadcast). 广播可以分为标准广播和有序广播. 注册广播的方法可以动态注册(在代码中进行注册)和静态注册(在清单文件中注册) 我们也可以发布自己定义的广播,并接收. 1.动态注册 动态注册的过程: 1)先自己定义一个广播接收者,继承Broadcast.重写onReceive()方法. 2)创建IntentFilter类,并添加要收听的广播. 3)创建自定义的广播接收者

android隐式意图激活自定义界面

我们也可以使用隐士意图激活自定义的界面,并且可以携带数据: 效果: 点击第二个按钮后: 附代码: 主窗体的代码: 1 package com.yy.twoactivity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.net.Uri; 6 import android.os.Bundle; 7 import android.view.View; 8 9 public clas

C#自定义工业控件开发

转自阿凡卢原文C#自定义工业控件开发 由于工作需要,调研过一段时间的工业控制方面的"组态软件"(SCADA)的开发,组态软件常用于自动化工业控制领域,其中包括实时数据采集.数据储存.设备控制和数据展现等功能.其中工控组件的界面展现的实现类似于Windows系统下的各种开发控件,通过各种控件的组装,和硬件协议的集成,就可以实现对相应设备的控制和实时状态的显示. 每个对应的硬件UI展示都可以用一个自定义控件来实现,如下图的一个温度计,就可以使用UserControl来实现. using S

android显示意图激活另一个Activity

android跳转到另一个界面,是app常用的操作.我们可以跳转到该应用本身的界面,亦可以跳转到系统的应用界面. 效果: 打开软件: 跳转到第二个界面: 跳转到系统应用的界面: 附代码如下: 主界面代码: 1 package com.yy.twoactivity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.V

android面试

http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html 2013-5-9号补充:今天最新的腾讯面试题.应该说是全部面试中最难的.我个人感觉.并且是个女面试官.好嗨皮啊,哈哈. 腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)

Android ImageView 点击更换头像

首先搭建布局 主界面布局: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orientation="horizontal" > 5 6

自定义控件的常用属性

一.BrowsableAttribute 指定一个属性或者事件是否在“属性”窗口PropertyGrid显示,默认显示 二.DisplayNameAttribute 指定一个属性或者事件在"属性"窗口PropertyGrid的显示名称 三.CategoryAttribute 指定一个属性或者事件在“属性”窗口PropertyGrid的排序顺序模式下的所属分类 四.DescriptionAttribute 指定一个属性或者事件在”属性“窗口PropertyGrid的描述 1 public

ToDictionary() and ToList()

ToDictionary() and ToList() 前言: 有两个简单好用的LINQ扩展方法 ToDictionary() 和ToList(),你可能知道或不知道,但是它的的确确可以简化查询转化为集合的任务: 简介: LINQ和延迟执行 据你所认识的LINQ,你可能会不知道这些查询表达式在幕后做了些什么. 让我们说说今天我们示例的目的,我们有一些POCO类(POCO代表传统CLR对象,指的是一个类,它只有非常少的功能,这一概念源自Java POJO). 1 // just a simple

类目,延展,协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意-(void)invert;//方法@end 实现部分 #import "NSMutableArray+Sort.h"@implementation NSMutableArray (Sort)