Objective-C学习笔记_类的扩展

  • 一Category的定义和使用
  • 二Extension的定义和使用
  • 三Protocol的定义和使用
    • delegate的使用

一、Category的定义和使用

Category,分类或类目。主要作用是为没有源代码的类添加方法。通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。

定义Category过程

  1. 新建?件
  2. 选择Objective-C Category模板
  3. 填写类名和分类名
  4. .h?件添加?法声明
  5. .m添加?法实现

Category的声明

NSString+SayHi.h文件

@interface NSString (SayHi)
- (void)hi;
@end

Category的实现

NSString+SayHi.m文件

#import “NSString+SayHi.h”
@implementation NSString(SayHi)
- (void)hi
{
  NSLog(@”这是通过category为NSString添加的hi?方法”);
}
@end

Category与?类的区别

Category(类目) Subclass(子类)
功能 只能为类添加方法 既能为类添加方法,也能添加变量
特点 新添加的方法会变成原始类的一部分,能被子类继承 新添加的方法只有子类才有,父类没有
使用 使用原始类的实例(-号方法)或者使用原始类(+号方法)调用方法 子类才能调用,

二、Extension的定义和使用

Extension,延展。主要作用是管理类的“私有”方法。面向对象编程在设计一个类的时候,有些方法需要对外公开(我们称为接口),有些方法仅仅内部使用。Extension的功能是帮我们去管理这些内部使用的方法(“私有”方法)。

定义Extension过程

Extension的语法格式和Category很相似,相当于把Category的.h文件放到了原始类的.m文件中。Extension针对的是本类,必须有源代码的类。

xxx.m文件

@interface xxx (ExtensionName)
  //你的方法列表
@end

@implementation xxx
  //方法的实现
@end

Category和Extension的区别

Category Extension
作用 为没有源代码的类添加方法 管理类的私有方法
格式 定义一对.h和.m 把代码写到原始类的.m文件中

三、Protocol的定义和使用

Protocol,协议,是iOS开发中常用的技术。协议是一套标准(一堆方法的声明),只有.h文件。就像一张任务清单,上?写了一堆需要处理的事。清单交给谁,谁就要去完成清单上规定的任务。接受协议的对象实现协议中定义的方法。即:清单交给谁,谁就要去完成清单上规定的任务。

协议分两种: 正式协议和非正式协议。

协议中的方法默认是必须实现的,即@required。关键字@optional修饰的?法是可选的,可实现也可以不实现。

协议和代理6个步骤

  1. 声明协议
  2. 设置代理人属性
  3. 让代理人调用方法(通知代理人执行方法)
  4. 签订协议
  5. 指定代理人
  6. 实现协议方法

以结婚为例子(女方和男方)

  1. 声明协议 (女方)
  2. 设置代理人属性 (女方)
  3. 让代理人调用方法(通知代理人执行方法) (女方)
  4. 签订协议 (男方)
  5. 指定代理人 (女方)
  6. 实现协议方法 (男方)

结婚示例的代码实现:

Girl.h文件代码如下:

#import <Foundation/Foundation.h>

#pragma mark 协议第一步
/* 声明协议 */
@protocol Marry <NSObject>

/* 方法分两种 */
@required /* 必需的 */
- (void)makeMoney;

@optional /* 可选的 */
- (void)washCloth;
- (void)cook;

@end

@interface Girl : NSObject
#pragma mark 协议第二步
/* 设置代理人属性, 注意:assign */
@property (nonatomic, assign) id<Marry> delegate;

@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;

#pragma mark 协议第三步
/* 通知代理人调用方法 */
- (void)marry;

@end

Girl.m文件代码如下:

#import "Girl.h"

@implementation Girl

#pragma mark 协议第三步
/* 通知代理人调用方法 */
- (void)marry
{
    NSLog(@"我和%@结婚了, %@负责挣钱了.", self.delegate, self.delegate);
    [self.delegate makeMoney];
}

@end

Boy.h文件代码如下:

#import <Foundation/Foundation.h>
#import "Girl.h" /* 只能是import */

#pragma mark 协议第四步
/* 签订协议 */
@interface Boy : NSObject<Marry>

@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

Boy.m文件代码如下:

#import "Boy.h"

@implementation Boy

#pragma mark 协议第六步
/* 实现协议方法 */
- (void)makeMoney
{
    NSLog(@"我是%@, 我负责挣钱.", self.name);
}

@end

main.m文件代码如下:

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /* 创建Girl 和 Boy对象 */
        Girl *girl = [[Girl alloc] init];
        girl.name = @"LiSi";
        girl.age = 22;

        Boy *boy = [[Boy alloc] init];
        boy.name = @"WangLaowu";
        boy.age = 25;
        #pragma mark 协议第五步
        /* 指定代理人 */
        girl.delegate = boy;
        [girl marry];
        }
       return 0;
    }

delegate的使用

Protocol的核?使用场景是实现delegate设计模式。delegate(代理),通俗的讲就是代理商,主要的任务是帮你完

成一些任务。比如:保姆就可以认为是delegate,主要的任务是帮你带孩子、做饭、洗衣服等。

使?场景:凡是某些任务?己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理帮你去做。你只需要通知代理去做某事。


版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 17:06:36

Objective-C学习笔记_类的扩展的相关文章

黑马程序员_IOS开发_Objective-C学习笔记_类(对象)

1.面向对象编程基本介绍: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的集合,类是对象的模板,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的安全性.重用性.灵活性和扩展性. 2.面向对象与面向过程 面向过程就是分析出解决问题所需要的步骤,然后基于这些步骤用代码和函数把这些步骤一步一步实现. 面向对象是把构成问题事务分解成各个对象,然后各个对象分别对相关的程序功能做出处

Objective-C学习笔记_类和对象

一 Objective-C概述 二 面向对象编程OOP Object Oriented Programming 三 类和对象 OC中类的定义 接口部分 实现部分 类和文件 创建对象 使对象 四 实例变量操作 一 Objective-C概述 Cocoa和Objective-C是苹果公司Mac OS X操作系统的核心.1980年初,Brad Cox发明了Objective-C,意将流行的.可移植的C语言和Smalltalk语言结合在一起:1985年,Steve Jobs成立NeXT公司,NeXT选择

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针 1.引言 在前面提到过,成员函数具有一个附加的隐含形参,即指向该类对象的一个指针.这个隐含形参命名为this. 2.返回*this 成员函数有一个隐含的附加形参,即指向该对象的指针,这个隐含的形参叫做this指针(编译器自动传递)使用this指针保证了每个对象可以拥有不同数值的数据成员,但处理这些成员的代码可以被所有对象共享.成员函数是只读的代码,由所有对象共享,并不占对象的存储空间,因为this指针指向当前对象,所以

C++ Primer 学习笔记_17_类与数据抽象(3)_类作用域

C++ Primer 学习笔记_17_类与数据抽象(3)_类作用域 引言: 每个类都定义了自己的新作用域与唯一的类型.即使两个类具有完全相同的成员列表,它们也是不同的类型.每个类的成员不同与任何其他类(或任何其他作用域)的成员. 一.类作用域中的名字查找 1)首先,在使用该名字的块中查找名字的声明.只考虑在该项使用之前声明的名字. 2)如果在1)中找不到,则在包围的作用域中查找. 如果找不到任何声明,则出错. 类的定义实际上是在两个阶段中处理: 1)首先,编译器声明: 2)只有在所有成员出现之后

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明 在C++中,用类来定义自己的抽象数据类型.通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写.调试和修改程序.可以使得自己定义的数据类型用起来与内置类型一样容易和直观. 看一下Sales_item类: class Sales_item { private: std::string isbn; unsigned units_sold; double revenue; public: double ave_pr

C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝、空类与空数组

C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝.空类与空数组 一.深拷贝与浅拷贝 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象. 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换而言之,深拷贝把要复制的对象所引用的对象都复制了一遍. 浅拷贝可

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员

类 --友元.static成员 一.友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类(对未被授权的函数或类,则阻止其访问):友元的声明以关键字friend开始,但是它只能出现在类定义的内部.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响. [最佳实践] 通常,将友元声明成组的放在类定义的开始或结尾是个好主意! 1.友元关系:一个例子 假设一个窗口管理类Window_Mgr可能需要访问由其管理的Screen对象的内部