OC中的类别Category-协议Protocol-… - 韩俊强的博客 - 博客频道 - CSDN.NET

OC中的类别Category-协议Protocol-

类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中。通常只在类别中定义方法。 类别,接口部分的定义,通常该文件命名为已有"类+类别名.h"

@interface 已有类 (类别名)
//.......方法实现
@end
#import 
#import "Buy.h"
@interface Person : NSObject <<span style="color: rgb(79, 129, 135);">Buy>
-(void)eat;
@end
实现如下:
#import "Person.h"
@implementation Person
-(void)buy//实现协议方法
{
    NSLog(@"Buy something---Protocol Method");
}
//这是一个公有方法,因为在.h有声明,第三方也可以用。
-(void)eat
{
    NSLog(@"I‘m eating-Person Class");
}
//这是一个私有方法。因为只在.m文件中定义,而没有在.h文件中声明
-(void)playFootball
{
    NSLog(@"Bob playing football--Private Method");
}
@end

例如,考虑为Person增加一个类别,则接口部分代码如下

#import @interfacePerson (OtherMethod)
-(void)sleep;@end

该类别的实现部分如下

#import "Person+OtherMethod.h"
@implementation Person (OtherMethod)
-(void)sleep
{
    NSLog(@"I‘m sleeping--Category");
}
@end
所有Person类的实例就都会具有sleep方法,从而实现对Person类的动态扩展。

我们知道,如果一个函数在.h文件中无声明而在.m文件中定义它的实现,那么该方法就是私有方法,只能在本类的文件中使用。  若我们在类别的接口部分声明这个方法,那么我们就可以实现对该私有方法的访问。

—————————————————————————————————————————————————————————————————————————————

扩展(extension)

扩展与类别相似,扩展相当于匿名类别,即没有类别名的类别

类别,接口部分的定义,通常该文件命名为已有"类_xxx.h"
@interface 已有类 ()
//.......方法实现
@end

在用法上,类别通常都都有单独的.h和.m文件。扩展则是临时的对某个类进行扩展,类的实现部分同时实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,可以增加额外的实例变量,也可使用@property和@synthesize关键字,但在定义类的额外列表时不允许额外定义实例变量。

有类名为Vehicle,只有name属性没有定义方法。对其进行扩展

#import "vehicle.h"
@interface Vehicle ()
@property(nonatomic, strong) NSString *color;
-(void) drive:(NSString *)name;
@end

为原来的Vehicle类增加color属性和drive:方法,因此在Vehicle.m实现文件里面要实现Vehicle.h里声明的方法及这个drive:方法。

//"Vehicle.m"
#import "Vehicle_ext.h"
@implementation Vehicle
-(void) drive:(NSString *)name
{
    NSLog(@"交通工具名称%@,颜色属性%@",_name,_color);
}
@end

在实际使用中,通用的做法是省略掉Vehicle_ext.h文件,而是将其中的内容直接添加在Vehicle.m文件@implementation前部即可。

—————————————————————————————————————————————————————————————————————————————

协议(protocol)

以NSObject为基础,为NSOject创建类别,创建类别时指定该类新增的方法,既可以实现非正式协议。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的所有方法 。

正式协议使用@protocol关键字定义

@protocol 协议名 <父协议1, 父协议2>
{
      //.....方法声明
}
@end

协议是支持多继承的。在OC2.0标准中新增了@required\@optional两个关键字,声明方式是必须是必须实现还是可选的,默认为@required.

遵守协议的语法如下

@interface 类名:父类型 <<span class="title">协议1, 协议2...>

使用协议来定义变量,那么这些变量只能调用该协议中声明的方法,否则编译器会提示错误。

使用协议来定义变量的两种语法

NSObject<<span class="title">协议1,协议2..>*变量名;
id<<span class="title">协议1,协议2...> 变量;

协议体现的是一种规范,定义协议的类可以把协议定义的方法委托(delegate)给实现协议的类,这样可以让类具有更好的通用性,具体的动作交给协议的实现类来完成。在大量的应用程序开发中大量依赖委托这个概念。

.embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed }
.embody_b { margin: 0; padding: 10px 0 }
.embody .embody_t,.embody .embody_c { display: inline-block; margin-right: 10px }
.embody_t { font-size: 12px; color: #999 }
.embody_c { font-size: 12px }
.embody_c img,.embody_c em { display: inline-block; vertical-align: middle }
.embody_c img { width: 30px; height: 30px }
.embody_c em { margin: 0 20px 0 10px; color: #333; font-style: normal }

时间: 2024-08-14 03:17:05

OC中的类别Category-协议Protocol-… - 韩俊强的博客 - 博客频道 - CSDN.NET的相关文章

iOS中 Realm的学习与使用 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发者交流QQ群:446310206  有问题或技术交流可以咨询!欢迎加入! 这篇直接搬了一份官方文档过来看的 由于之前没用markdown搞的乱七八糟的 所以重新做了一份 后面看到官网的中文文档更新不及时看着英文翻译了一点 搞的更乱了 :( 英文好的直接点右边->官方OC文档 Realm是一个移动端的数据库,Realm是SQLite和CoreData的替代者.它可以节省你成千上万行代码和数周的工作,并且

iOS中 UITableViewCell cell划线那些事 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 在开发中经常遇到cell分割线显示不全或者想自定义线的宽高等; 最近总结了一下,希望帮到大家: 1.不想划线怎么办? TableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; // 设置系统默认线的样式 -(void)viewDidLayoutSubviews { if ([TableView respondsToSelector:@selecto

iOS中 MPMoviePlayer 实现视频音频播放 作者:韩俊强

ios播放视频文件一般使用 MPMoviePlayerViewController 和 MPMoviePlayerController.前者是一个view,后者是个Controller.区别就是 MPMoviePlayerViewController里面包含了一个MPMoviePlayerController 注意:MPMoviePlayerViewController 必须   presentMoviePlayerViewControllerAnimated方式添加,否则Done按钮是不会响应

iOS中 为 iOS 建立 Travis CI 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 你是否曾经试着为 iOS 项目搭建一台支持持续集成的服务器,从我的个人经验而言,这可不是一个轻松的活.首先需要准备一台 Mac 电脑,并安装好全部所需的软件和插件.你要负责管理所有的用户账户,并提供安全保护.你需要授予访问仓库的权限,并配置所有的编译步骤和证书.在项目运行时期,你需要保持服务器的稳健和最新. 最后,原本你想节省的时间,会发现你花费了大量的时间去维护这台服务器.不过如果你的项目托管在 GitHub

iOS中 自定义cell分割线/分割线偏移 韩俊强的博客

在项目开发中我们会常常遇到tableView 的cell分割线显示不全,左边会空出一截像素,更有甚者想改变系统的分割线,并且只要上下分割线的一个等等需求,今天重点解决以上需求,仅供参考: 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 1.cell 分割线不全: 解决方案1: 补全分割线 -(void)viewDidLayoutSubviews { if ([_listTableView respondsToSelector:@selector(setSep

iOS中 流媒体播放和下载 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 iOS中关于流媒体的简介:介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放,而渐进式下载不必等到全部下载完成后再播放,它可以一边下载一边播放,在完成播放内容之后,整个文件会保存在手机上. 实时流媒体 实时流媒体是一边接收数据包一边播放,本地不保留文件副本,实时流式传输总是实时传送,可以实时实况转播,支持随机访问,用户可以快进或者快退以观看前面或后面的内容.实时流媒体传输

iOS中 扫描二维码/生成二维码详解 韩俊强的博客

最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[SecondViewController new]]; 每日更新关注:http://weibo.com/hanjunqi

iOS中 HTTP/Socket/TCP/IP通信协议具体解释 韩俊强的博客

简介: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. 物理层 // TCP/IP, 由美国国防部制定 // 1. 应用层, HTTP, FTP, SMTP, DNS // 2. 传输层, TCP, UDP // 3. 网络层, IP // 4. 链路层, ARP, RARP // HTTP(短连接) // 1. 建立链接, 三次握手 // 2

iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. 物理层 // TCP/IP, 由美国国防部制定 // 1. 应用层, HTTP, FTP, SMTP, DNS // 2. 传输层, TCP, UDP // 3. 网络层, IP // 4. 链路层,