为一个类扩展功能:1.子类化;2.修改源代码;3.定义协议;4.Category:类目

1、Category

1> Category的作用

Category:也叫分类,类目,是为没有源代码的类扩充功能。

扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承。

该方法只能扩充方法,不能扩充实例变量。

作为子类的替代手段(不需要定义子类,直接使用现有类的对象调用方法)。

一个庞大的类可以分模块开发,能够更好的对类中的方法进行更新和维护。

2> Category文件的创建

① 新建文件(command + N )

② 为Category文件的创建

③ 创建成功

3> Category的使用

① 在类目的.h文件中声明需要添加的方法

 @interface NSString (AddMethod) //声明sayHi方法

 + (void)sayHi;

 @end

类名(扩展名)—— AddMethod:是扩展的类名,NSString是原有类名。

②在类目的.m文件中实现对应的方法

 @implementation NSString (AddMethod) //实现sayHi方法
+ (void)sayHi {
NSLog(@"我是字符串"); }
@end

③ main函数

          #import <Foundation/Foundation.h>
#import "NSString+AddMethod.h"
int main(int argc, const char * argv[]) {
@autoreleasepool { // 1.使用类目添加的方法首先需要在对应的类中导入类目的.h文件。
// 2.sayHi方法是通过类目为NSString类添加的一个类方法,因此该方法的调用需要NSString类名调 。 [NSString sayHi];
}
return ;
}

2、Extension

1> Extension的使用场景

为能够获得源代码的类添加私有的实例变量和方法。

注意:延展操作的类必须是能够获得源代码的类(具有.m文件的类)

2> Extension的语法格式

          // 声明
@interface Teacher()
{
NSInteger _salary; //存储对应的薪资
}
- (NSInteger)getSalary; //声明一个领工资的方法
@end @implementation Teacher
//实现领工资的操作
- (NSInteger)getSalary {
NSLog(@"这个月发了不少,可以吃大餐了");
_salary = ;
return _salary;
}
@end

3> Extension的使用

main.m中调用getSalary

  通过延展调用的方法属于私有方法,外界是没有访问权限的,只能在当前类的.m文件中访问

Category 和 Extension 的区别

作用不同:Category是扩展类的功能的,Extension是用来给类声明私有方法和实例变量的。

Category存放在一对.h .m文件中,Extension存放在.m文件中。

Extension可以添加实例变量,Category不可以。

3、delegate设计模式

1> delegate的三个要素

delegate设计模式的使用我们首先需要明白三个要素-委托方,代理方,协议。

委托方:委托别人去执行某些操作的人(对象)。

协议(Protocol):委托方需要代理方执行的操作。

代理方:被委托去执行某些操作的人(对象)。

2> 协议(Protocol)的定义

协议是一套标准(一堆方法的声明),只有.h文件。协议的定义以@protocol开始,以@end结束。

比如:声明一个结婚协议:

 @protocol MarryProtocol <NSObject>

 @required // 必须实现的
- (void)makeMoney; // 赚钱 @optional // 可选的
- (void)cooking; // 做饭 @end

3> delegate的设计步骤

步骤1:委托方制定一套协议(在委托方的.h文件中),协议中声明委托方需要让代理方执行的方法(只有方法声明)。

步骤2:委托方声明一个delegate属性(assign修饰),存储代理方对象。

步骤3:代理方需要遵守协议,并且对协议中的方法进行实现。

步骤4:将代理方设置为委托方的代理人(将代理方对象赋值给委托方对象的delegate属性,进行存储)

步骤5:委托方在合适的时机通知代理方对象去执行相应的操作。

4> 案例

找保姆,要求保姆完成:1.洗衣服。2.做饭。3.打扫房间。4.照看孩子。

协议HireProtocol.h文件

 #import <Foundation/Foundation.h>

 @protocol HireProtocol <NSObject>

 // 1.洗衣服
- (void)washClothing; // 2.做饭
- (void)cooking; // 3.打扫房间
- (void)cleanHouse; // 4.照看孩子
- (void)careForChild; @end

Employer(雇主)类:

声明Employer.h文件

 #import <Foundation/Foundation.h>
#import "HireProtocol.h" @interface Employer : NSObject @property (nonatomic, retain) id<HireProtocol> nanny; // 被雇佣的保姆 // 1.衣服脏了
- (void)clothingDirty; // 2.饿了
- (void)hungry; // 3.房子乱了
- (void)houseMess; // 4.出门了
- (void)goOut; @end

实现Employer.m文件

 #import "Employer.h"

 @implementation Employer

 // 1.衣服脏了
- (void)clothingDirty
{
[self.nanny washClothing];
} // 2.饿了
- (void)hungry
{
[self.nanny cooking];
} // 3.房子乱了
- (void)houseMess
{
[self.nanny cleanHouse];
} // 4.出门了
- (void)goOut
{
[self.nanny careForChild];
} @end

Nanny(保姆)类:

声明Nanny.h文件

 #import <Foundation/Foundation.h>
#import "HireProtocol.h" @interface Nanny : NSObject<HireProtocol> // 属性自己看着写... @end

实现Nanny.m文件

 #import "Nanny.h"

 @implementation Nanny

 // 1.洗衣服
- (void)washClothing
{
NSLog(@"洗衣服");
} // 2.做饭
- (void)cooking
{
NSLog(@"做饭");
} // 3.打扫房间
- (void)cleanHouse
{
NSLog(@"打扫房间");
} // 4.照看孩子
- (void)careForChild{
NSLog(@"照看孩子");
} @end

主函数main.h

 #import <Foundation/Foundation.h>
#import "Employer.h"
#import "Nanny.h" int main(int argc, const char * argv[]) {
@autoreleasepool { /*
找保姆,要求保姆完成:1.洗衣服。2.做饭。3.打扫房间。4.照看孩子。
*/ Employer *employer = [[Employer alloc] init];
Nanny *nanny = [[Nanny alloc] init]; employer.nanny = nanny; [employer clothingDirty]; [employer hungry]; [employer houseMess]; [employer goOut]; }
return ;
}

iOS学习19之OC类的扩展的更多相关文章

  1. 【IOS学习基础】OC类的相关

    几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...

  2. iOS学习10之OC类和对象

    本次是OC的第一节课,主要是学习和理解类与对象 1.面向对象 1> OOP(Object Oriented Programming)面向对象编程. 面向对象以事物为中心,完成某件事情都需要哪些事 ...

  3. iOS学习之Object-C语言类的扩展

    一.Category      1.Category:也叫分类,类目.是为没有源代码的类扩充功能.扩充的功能会成为原有类的一部分,可以通过原有类或者原有的对象直接调用,并且可继承.      2.注意 ...

  4. IOS基础之 (十二) 类的扩展

    对OC类的扩展总结如下,共有4个: 1.子类 subClass 作用:可以使用类的继承来增添父类的变量和方法. 写法:在.h文件中 @interface Student : Person 2.分类 C ...

  5. IOS学习之路--OC的基础知识

    1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouc ...

  6. iOS学习13之OC NSString类

    C语言中,字符串是有char(ASC||码)字符组成. OC中,字符串是由unichar(Unicode)字符组成. 1.字符串(NSString) NSString:不可变字符串,即:创建以后,内容 ...

  7. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  8. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  9. iOS学习16之OC集合遍历和数组排序

    1.集合遍历 1> 遍历 集合(Collection):OC中提供的容器类:数组,字典,集合. 遍历:对集合中元素依次取出的过称叫做遍历. 三种方式:① for循环遍历: ② NSEnumera ...

随机推荐

  1. Redis使用总结(1):基础使用

    Redis的安装及启动 安装 Ubuntu sudo apt-get install redis Mac sudo brew install redis Windows 不支持 启动 首先启动Redi ...

  2. HtmlAgilityPack搭配 ScrapySharp或HtmlAgilityPack.CssSelectors

    Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲 美:)Html A ...

  3. [前端]使用JQuery UI Layout Plug-in布局 - wolfy

    引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ...

  4. Lua使用心得(1)

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  5. iOS阶段学习第14天笔记(NSString与NSMutableString)

    iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...

  6. 获取PC或移动设备的所有IP地址

    不论是PC还是移动设备,都有可能同时存在几个IP地址(如具有多块网卡),本文介绍怎样获得PC或移动设备的所有IP地址. // 获得所有IP地址 public static void get_ip(){ ...

  7. Firemonkey TComboBox 下拉菜单字型修改方法 (D10)

    在 FMX 下的 TComboBox 下拉菜单字型修改有二种方法: uses FMX.Pickers; 使用 Style,需先设定好 Style 后,再指定预设项的 Style,方法如下: proce ...

  8. 钉钉服务器端SDK PHP版

    项目地址: https://github.com/web3d/DingtalkSDK.git 钉钉官方有些简单的demo,但封装得有些粗糙. 开发的过程中,做了一个有点小意思的工具:json数据转换为 ...

  9. 【书籍下载链接】_1_第一轮_C语言书籍

    各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...

  10. 2016暑假多校联合---GCD

    Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). ...