码迷,mamicode.com
首页 > 其他好文 > 详细

objective-C 类别/协议。

时间:2015-07-28 06:50:11      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:interface   dynamic   category   number   命名方式   

第十二章 类别

    

类别:

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

在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 (assignNSInteger thing1;

@property (readonly,assign ) NSInteger thing2;

-(void) resetAllValues;

@end


@interface Thing ()

{

    NSInteger thing4;

}

@property (readwrite,assignNSInteger thing2;

@property (assignNSInteger 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),第二个是用来设置委托的,参数的委托类型告诉我们,只要遵守所需的协议,就可以设置任意对象为委托。



objective-C 类别/协议。

标签:interface   dynamic   category   number   命名方式   

原文地址:http://wenran.blog.51cto.com/9428559/1678914

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!