【OC基础】02-分类(Category)和协议(Protocol)

一、分类(Category)

(1)、分类的基础知识

分类是在不改变原有类内容的基础上,为类增加一些方法的方式。

(2)、分类的注意事项

1>分类只能增加方法,不能增加成员变量;

2>在分类方法的实现中可以访问原来类中的成员变量;

3>分类中可以重新实现原来类中的方法,但是这样会导致原来的方法无法在使用

4>在大规模应用中。通常把相应的功能写成分类,对原有的类进行扩充,一般分模块写,一个模块一个分类

二、分类的实现

我们可以再上一节Student类的基础上增加分类:

CateStudent.h方法声明:

1 #import <Foundation/Foundation.h>
2 #import "Student.h"
3 @interface Student (CatStudent)
4 - (void)eat;
5 - (void)study;
6 @end

CateStudent.m方法实现:

 1 #import "CateStudent.h"
 2 @implementation Student (CatStudent)
 3
 4 - (void)eat {
 5     NSLog(@"add eat,age=%i...",age);
 6 }
 7
 8 - (void)study {
 9     NSLog(@"add study...");
10 }
11
12 @end

main.m的实现:

 1 #import <Foundation/Foundation.h>
 2 #import "CateStudent.h"
 3 int main(int argc, const char * argv[])
 4 {
 5
 6     @autoreleasepool {
 7
 8         // insert code here...
 9         Student *stu = [[Student alloc]init];
10         [stu eat];
11         [stu study];
12         [stu release];
13     }
14     return 0;
15 }

二、协议(Protocol)

(1)、协议介绍

在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。这就像面向对象编程语言中的接口一样,因为OC中Interface已经用于定义类了,所以定义接口用了一个新的关键字Protocol。

(2)、协议的注意事项

1>一个协议可以扩展自另一个协议,例如上面AnimalDelegate就扩展自NSObject,如果需要扩展多个协议中间使用逗号分隔;

2>和其他高级语言中接口不同的是协议中定义的方法不一定是必须实现的,我们可以通过关键字进行@required和@optional进行设置,如果不设置则默认是@required(注意ObjC是弱语法,即使不实现必选方法编译运行也不会报错);

3>协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔;

4>协议的实现只能在类的声明上,不能放到类的实现上(也就是说必须写成@interface Person:NSObject<AnimalDelegate>而不能写成@implementation Person<AnimalDelegate>);

5>协议中不能定义属性、成员变量等,只能定义方法;

三、协议的实现

协议的声明PersonDelegate.h文件:

 1 #import <Foundation/Foundation.h>
 2
 3 @protocol PersonDelegate <NSObject>
 4  @required
 5 - (void) eat;
 6
 7 @optional
 8
 9 - (void)run;
10 - (void)say;
11 @end

Student.h文件:

1 #import <Foundation/Foundation.h>
2 #import "PersonDelegate.h"
3 @interface Student : NSObject<PersonDelegate>
4
5 - (void) eat;
6 - (void) study;
7
8 @end

Student.m文件:

 1 #import "Student.h"
 2
 3 @implementation Student
 4 - (void) eat {
 5     NSLog(@"eat...");
 6 }
 7 - (void) study {
 8     NSLog(@"study...");
 9 }
10 @end
时间: 2024-10-13 03:00:23

【OC基础】02-分类(Category)和协议(Protocol)的相关文章

OC基础--分类(category) 和 协议(protocol)

OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低,导致了分类文件和协议文件没有找到,最后百度得知: 如图:Xcode 7.2版本中的category文件和protocol文件都归类到了Objective-C File 中   一.category文件: 作用:可以扩展自定义类,或者系统类.下面的实例,是扩展了NSString 类,在类中扩展了计算字

OC基础笔记——分类category

分类(类别)作用:扩展已有类的功能 1.分类是原来的类增加方法 2.在方法内部可以访问原有类的成员变量(定义头文件中) 步骤 1.为原有类创建一个分类 2.在分类中增加新的方法的声明和实现 注意点: 1.分类中不能扩展原有类的成员变量 2.@property在分类中只能生成getter setter方法的声明,不能生成实现和成员变量 // 分类可以扩充系统自带的类的功能 给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎小心 3.你不能在分类中定义与原有类同名方法,不同的分类之间

IOS开发——OC基础-ARC、BLOCK、协议

一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切ARC规则:只要还有一个强指针变量指向对象,对象就会保持在内存中弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误使用注意:1.不允许调用release.retain.re

OC基础(十二)协议

在OC基础(十一)中我们讨论了类别和非正式协议的奇妙之处.在使用非正式协议时,可以只实现你想要获得响应的方法.也不必在对象中声明任何内容来表示该对象可用作委托对象.所有这些任务可以用最少的代码完成. 下面来学习正式协议. 1. 正式协议 与非正式协议一样,正式协议包含了方法和属性的有名称列表.但与非正式协议不同的是,正式协议需要显示地采用.采用(adopt)协议的办法是在类的@interface声明中列出协议的名称.采用协议后,你的类就要遵守该协议.采用协议就意味着你承诺实现该协议的所有方法.否

Arc 自动内存管理 分类Category 类扩展 Block 代码段 和 Protocol协议的一些简单知识的总结

1. Arc的使用 Arc是自动内存管理: arc的使用原则 1).只要对象没有任何强类型指针引用就会被释放’. 2).只要对象被任何强类型指针指引就不会被释放. 弱指针:__weak 被__weak修饰的指针就被称为弱型指针: 强类型指针 默认的指针都是强类型指针: 被__strong修饰的指针也是强类型指针. 使用Arc时可以重写dealloc方法,但是在重写方法时不能手动调用[super dealloc]: 在Arc中通过@property生成的属性如果是OC的对象那么要用Strong来修

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使