objective-C 类别/协议。

第十二章 类别

类别:

命名方式: 类名称+类别名称。

在Xcode中可以在新建文件的类别中找到 Objective-C category图标。

@interface部分

类别的声明看起来非常像类的声明:

@interface NSString (NumberConvenience)

-(NSNumber *) lengthAsNumber;

@end

括号内(NumberConverience)叫做类别名,且它是添加给NSString类的。 整句话可以理解为:我们为NSString类添加了一个名为NumberConverience的类别。

可以在类别中添加属性,但不能添加实例变量,而且属性必须是@dynamic(动态)类型的,添加属性的好处在于你可以通过点表达式来访问setter和getter方法。

@implementation

@implementation NSString (NumberConvenience)

-(NSNumber *) lengthAsNumber{

NSUInteger length = [self length];

return ([NSNumber numberWithUnsignedInt:length]);

}

@end

类别的优势:

3个用途:1.将类对实现代码分散到多个不同的文件或者框架中。

2.创建对私有方法的前向引用。

3.向对象添加非正式协议。(informal protocol)

类别的缺陷:

1.无法向类中添加新的实例变量,类别没有空间容纳实例变量。

2.名称冲突,也就是类别中的方法与现有的方法重名。当发生冲突的时候,类别具有更高的优先级。你的类别方法将会完全取代初始方法,导致初始方法不可用。

(使用全局字典来存储对象与你想要关联的额外变量之间的映射可以克服类别无法增加实例变量的局限。)

一个特殊的类别:类扩展。

特点:1.不需要名字。2.你可以在包含你的源代码多类(也就是自己的类)中使用它。3.你可以添加实例变量。4.你可以将只读权限改成可读写的权限。5.创建数量不限。

@interface Things : NSObject

@property (assign) NSInteger thing1;

@property (readonly,assign ) NSInteger thing2;

-(void) resetAllValues;

@end

@interface Thing ()

{

NSInteger thing4;

}

@property (readwrite,assign) NSInteger thing2;

@property (assign) NSInteger thing3;

@end

这里没有继承的父类,我们所做的基本上就是获取Things类,并通过添加私有属性和方法来扩展它。

常用的策略是将类别置于实现文件多最前面。在访问其他类的私有方法时,只要在类别中声明这些方法编译器就不会产生警告。

应用程序不可以访问类里面的私有变量和方法,否则将不能通过App Store。

非正式协议和委托类别

Cocoa中的类经常会有一种名为委托的技术,委托是一种对象,由另一个类请求执行某些工作。

run循环是一种Cocoa概念,它在等待某些事情发生之前一直处于阻塞状态,既不执行任何代码。除了监听网络流量之外,run循环还处理像等待事件,(按键或鼠标单击)之类的操作。

#import <Foundation/Foundation.h>

@interface ITunesFinder : NSObject <NSNetServiceBrowserDelegate>

@end

再nsobject后使用了NSNetServiceBrowserDelegate协议 它告诉编译器和其他对象,该类符合这个名称点协议并实现了其方法。

委托对象只需要实现已经打算调用的方法即可。

托管强调类别的另一种应用:被发送给托管对象的方法可以声明为一个NSObject的类别。

NSNetServiceBrowser的实现可以将这些消息之一发送给任何对象,无论这些对象实际上属于哪个类,这也意味着只要实现了委托方法,任何类的对象都可以成为委托对象。

创建一个NSObject类别称为创建一个非正式的协议。非正式协议只是一种表达式,他表示“这里有一些你可能希望实现的方法,你可以使用它们更好的完成工作。”

选择(selector)器只是一个方法的名称,但他以OC运行时使用特殊方式编码,以快速执行查询。

NSObject提供了一个名为respondsToSelector:的方法,该方法用来询问对象以确定其是否能够响应某个特定点消息。

Car *car = [[Car alloc] init];

if ([car respondsToSelector:@selector(setEngine:)]) {

NSLog(@"yo yo ..");

}

这段代码可以正常输出yo yo .. ,因为Car类的对象确实能够响应setEngine:消息。

为了确认托管对象能否响应消息,NSNetServiceBrowser将调用respondsToSelector:@selector(netServiceBrowser:didFindService:moreComing:)。如果该托管对象能够响应给定的消息,则浏览器向该对象发送此消息。否则浏览器将暂时忽略托管对象,继续正常运行。

选择器可以被传递,可以用作方法的参数使用,甚至可以作为实例变量被存储。

Foundation框架中的NSTimer就是这样的类,它能够反复大向一个对象发送消息。



本章总结:

类别的概念,功能。类扩展,选择器。

这一章看起来比较容易理解,但是却不清楚该怎么用。。```



第十三章 协议

正式协议:

包含了方法和属性的有名称列表,但与非正式协议不同的是正式协议要求显式的采用。方法是在类的@interface声明中列出协议的名称。采用协议就意味着你承诺实现该协议所有方法。否则将得到警告。

通常可以将NSObject作为根协议,但是与NSObject类不同,NSObject类符合NSObject协议,这意味着所有对象都符合NSObject协议。

id类型表示一个可以指向任何类型的对象的指针,它是一个泛型对象类型。你可以讲任何对象复制给一个id类型的变量,反之亦可。

NSControl类中有一个名为setObjectValue:的方法,该方法要求对象追求NSCopying协议: -(void) setObjectValue: (id<NSCopying>) object;

在协议中如果增加了两个协议修饰符: @optional 和 @required 。在这两个修饰符之间的方法可以选择性的实现。

委托(delegation)方法:

委托就是某个对象指定另一个对象处理某些特定的设计模式。

-(id <NSNetServiceBrowserDelegate>) delegate;

-(void) setDelegate:(id <NSNetServiceBrowserDelegate>) delegate;

第一个方法会返回当前的委托对象(如果没有则返回nil),第二个是用来设置委托的,参数的委托类型告诉我们,只要遵守所需的协议,就可以设置任意对象为委托。

时间: 2024-08-25 00:16:46

objective-C 类别/协议。的相关文章

Objective中的协议(Protocol)

作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明. 协议的声明: @protocol 协议名称 <NSObject> //方法的声明; @end 新建1个协议的方式. NewFile OC-File - protocol 协议的文件名: .h 并且只有1个.h文件. 在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 类遵守协议: 如果想要让1个类,拥有协议中定义的所有的

Objective - C 之协议

一.创建方法: 二.实现过程: 1.遵循协议: @protocol NurseWorkingProtocol <NSObject>   //<> 表示遵守协议,创建时就有(NurseWorkingProtocol.h中) 2.协议内容:(NurseWorkingProtocol.h中) @required  // 必须做的,默认 - (void)cleanHouse; @optional  // 可选的 - (void)cook; 3.指定遵循协议的人:(Nurse.h中) @in

Objective-C中的类目,延展,协议

Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词的时候,有种感觉这是不是学习的坎?这东西难不难?能不能学会?经过本人亲自验证,这三个东西理解起来还是蛮简单的,学过C++或者Java的小伙伴对比理解还是蛮轻松的.类目(Category)就是给已有的类扩充相应的方法,扩充的方法是公有的,类目还可以起到分模块的功能,下面会详细说到. 延展(Extens

x code 编译器英文速记

master-detail Application 主应用程序 page-based Application 基于页面的应用 Single View Application 单视图中的应用 Tabbed Application 标签中的应用 cocoa Touch Framework Cocoa Touch框架 Cocoa Touch Static library Cocoa Touch静态库 In- App purchase Empty 在应用程序购买空 Command Line Tool 命

2017.3.22上午

一.RIP 1.  距离矢量型路由协议 2.  RIPv1是有类别的,RIPv2是无类别的,RIPng是IPV6版本.(有类别协议和无类别协议最大的区别就是更新的时候是否携带子网掩码,无类别携带子网掩码) RIP使用跳数(hop)作为度量标准 使用UDP协议,端口号520 周期性发送更新(默认周期30s) RIPv1使用广播更新(255.255.255.255) RIPv2使用组播更新(224.0.0.9)为了减小对不相干设备的影响. 二.距离矢量型RIP 1.对于RIP来讲,距离=跳数 矢量=

cisco learn book index

------------------------------------------------------------------ Routing TCP/IP Volume 1 , Second Edition ------------------------------------------------------------------ Routing TCP/IP Volume 2 ---------------------------------------------------

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

OC中SEL,类别,继承,协议的使用

1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明SEL的使用. 直接通过方法名来调用,我们先新建一个Student类,并在其中定义一个名叫Test的对象方法.并定义一个输出语句: -(void)test { NSLog(@"这是SEL的测试方法"); } 我们在Main方法中通过SEL调用就会输出以上结果,如下: SEL s = @se

iOS协议、代理、Block和回调、类别

[协议](Protocol) //协议是用来规范接口,实现对象间交互的一种机制.类似于JAVA中的接口,可以模拟. 协议的权限 @optional//可选的 @required//必须的 [代理] 一.代理的概念 [注]代理是实现两个类的对象间通信的一种机制. [委托方]主动方 持有带协议的id指针,可以使用协议. [代理方]被动方 遵从协议,实现方法. 代理回调(反向传值) //当我们需要完成某个功能模块,但不知道使用功能模块的是哪个对象,通过协议,可以规定接收数据的对象通过哪个方法获得数据.

OC中类别、扩展、协议与委托

类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有"类+类别名.h" @interface 已有类 (类别名) //.......方法实现 @end 例如,考虑为NSNumber增加一个类别,则接口部分代码如下 <p style="margin-top: 0px; margin-bottom: 0px; font-family: