(Object-C)学习笔记(四) --OC的协议、分类、扩展

OC的协议

  协议就是规则,定义了一个协议就相当于制定了一个规则。OC中的类可以遵守规则,遵守协议的类就相当于多了一种或几种能力。将一些属性和方法方法放到一个协议里,可以方便的添加进其他类里面。

协议的定义:

@protocal

  @required 声明必须遵守的属性和方法  默认

  @optional 声明可选遵守的属性和方法

@end

协议的遵守:

@interface TRMyClass : NSObject<TRMyProtocol> 协议在尖括号中     若是遵守多个协议 @interface TRClassC : NSObject<TRProtocol4, TRProtocol5>

创建一个协议:

选中Object - C File 进去。

类型选择协议。

协议是一个.h文件:

1 #import <Foundation/Foundation.h>
2
3 @protocol TRMyProtocol <NSObject>
4 @property NSString *name;
5 -(void)show;
6 @end

遵守协议的类

TRMyClass.h

1 #import <Foundation/Foundation.h>
2 #import "TRMyProtocol.h"
3
4 @interface TRMyClass : NSObject<TRMyProtocol>
5 @property NSString *zsname;
6 -(void)fun;
7 @end

TRMyClass.m

 1 #import "TRMyClass.h"
 2
 3 @implementation TRMyClass
 4 @synthesize name = _name;
 5
 6 -(void)show
 7 {
 8     NSLog(@"1名字是%@", self.name);
 9     NSLog(@"2%@",self.zsname);
10     self.zsname = @"李四";
11     NSLog(@"3%@",self.zsname);
12     NSLog(@"4%@",_name);
13
14 }
15
16 -(void)fun
17 {
18     NSLog(@"非协议方法");
19 }
20
21 @end

main.m

 1  #import <Foundation/Foundation.h>
 2  #import "TRMyProtocol.h"
 3 #import "TRMyClass.h"
 4
 5  void test()
 6 {
 7      id<TRMyProtocol> ref = [[TRMyClass alloc] init];
 8       ref.name = @"张三";
 9      [ref show];
10      //[ref fun];
11  }
12 int main(int argc, const char * argv[]) {
13
14     @autoreleasepool {
15
16
17
18         test();
19
20
21
22     }
23
24     return 0;
25
26 }

OC的分类

  什么是分类:

    分类是类的补充和扩展部分

     分类是类的一部分

     分类给类添加特定能力

创建一个分类:

选择 Category

下面的Class变成可选的

TRFraction.h

1 #import <Foundation/Foundation.h>
2
3 @interface TRFraction : NSObject
4 @property int n;
5 @property int d;
6 -(void)fun;
7 -(void)show;
8 @end

TRFraction.m

 1 #import "TRFraction.h"
 2 #import "NSObject+TRShow.h"
 3
 4 @implementation TRFraction
 5 -(void)fun
 6 {
 7     NSLog(@"in main class fun");
 8 }
 9 -(void)show
10 {
11     [super show];
12     NSLog(@"%d/%d", self.n, self.d);
13 }
14 @end

TRTest.h

1 #import "TRFraction.h"
2
3 @interface TRFraction (TRTest)
4 -(void)showTest;
5 @end

这里也可以重写show方法,我因为其他的分类重写了show方法,如果在这个分类再写show方法有警告。

TRTest.m

1 #import "TRFraction+TRTest.h"
2
3 @implementation TRFraction (TRTest)
4 -(void)showTest
5 {
6     NSLog(@"秀一下Test");
7 }
8 @end

main.m里面import一下就可以使用分类的方法,分类的方法相当于类的方法,没什么区别。

http://www.cnblogs.com/wendingding/p/3709569.html

OC的扩展(延展)

  延展是特殊的分类,延展是没有名字的分类。延展一般定义在.m文件中,延展可以定义属性、方法、实力变量,以上都是私有的,只能在.m文件里使用。

分类与延展的区别

  分类:分类不能定义变量,通常是公开的,分类文件名“主类类名+分类类名”

   延展:延展通常是私有的,可以定义实例变量,延展文件名“主类类名_延展类名”

TRFraction.h

1 #import <Foundation/Foundation.h>
2
3 @interface TRFraction : NSObject
4 @property int n;
5 @property int d;
6 -(void)show;
7 @end

TRFraction.m

 1 #import "TRFraction.h"
 2 #import "TRFraction_myExtension.h"
 3
 4 @interface TRFraction ()//无名的分类是扩展
 5 @property int value;//私有的
 6 -(void)extensionMethod1;//私有的
 7 @end
 8
 9 @implementation TRFraction
10 -(void)show
11 {
12     NSLog(@"%d/%d", self.n, self.d);
13 }
14 -(void)extensionMethod0
15 {
16     NSLog(@"扩展方法");
17 }
18 -(void)extensionMethod1
19 {
20     NSLog(@"扩展方法1");
21 }
22 @end

  

时间: 2025-01-05 13:26:08

(Object-C)学习笔记(四) --OC的协议、分类、扩展的相关文章

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

Object C学习笔记25-文件管理(一)

在此篇文章中简单记录一下文件管理,在Object C中NSFileManager用于管理文件已经路径.在Object C中的文件路径可以是相对路径也可以是绝对路径.斜线"/"开头,斜线实际上就是一个目录,称为 根目录.字符(-)用作用户主目录的缩写.点" . "表示当前目录,两点"  .. "表示父目录. 一. 创建NSFileManager 对象 NSFileManager非常简单,可以使用如下方式来创建NSFileManager对象. NSS

Object C学习笔记26-文件管理(二)

上一篇简单的介绍了如何获取文件属性,删除,拷贝文件等,本文继续记录Object C中文件IO操作. 一. 获取文件的执行主目录 在Object C中提供了一个方法 NSHomeDirectory() 用于获得执行执行的主目录,使用如下代码测试: NSString *homePath=NSHomeDirectory(); NSLog(@"执行文件的主目录:%@",homePath); 通过以上代码可以正确的输出应用程序的执行目录,上一张也提到了文件的目录问题,这个和Windows系统的有

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

CCNA学习笔记四——Telnet CDP

CDP协议:Cisco发现协议 show cdp show cpd neighbors:查看当前设备连接了哪些Cisco设备 cdp timer:修改发送间隔时间 cdp holdtime:修改保留时间 cdp advertise-2:修改版本号 debug cdp packets show cdp traffic:查看有关cdp包的统计信息 show cdp interface:查看端口cdp信息 show cdp entry:查看所有邻居的详细信息 cdp run:全局开启所有接口cdp协议

Linux System Programming 学习笔记(四) 高级I/O

1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and multiple buffers This type of I/O is so named because the data is scattered into or gathered from the given vector of buffers Scatter/Gather I/O 相比于 C标准

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了