基本语法 protocols Category extension

转:http://blog.csdn.net/wangeen/article/details/16989529

protocol   本质就是一系列的method的声明,他并不像class是必须的选项,根据自己的设计模式来选择性的使用。

protocol协议时为了补充Objective-C 只能单继承的缺陷而增加的一个新功能。Objective-C重所有的方法都是虚方法,所以在oc重也就没有关键字 virtual一说,有了协议可以补充

Objective-C单继承的缺陷,协议并不是一个真正的类,在协议的里面只声明方法不实现,并且在协议当中不能声明实例变量,如果一个类实现了某一个协议的方法,那么称折各类遵

循(遵守,采用)了这个协议,正式的协议在类中必须被实现,一个类可以实现多个协议,一个协议也可以被多个类实现,

Category

http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html

—Category—

首先我们来谈谈Category。

Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。

实现起来很简单,我们举例说明。

SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 

这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:

#import "SomeClass.h"

@interface SomeClass (Hello)
-(void)hello;
@end

实现文件代码如下

#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
    NSLog (@"name:%@ ", @"Jacky");
}
@end 

其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。

调用也非常简单,毫无压力,如下:

首先引入Category的声明文件,然后正常调用即可。

#import "SomeClass+Hello.h"

SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 

执行结果是:

name:Jacky 

Category的使用场景:

1、当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。

2、一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现

3、当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。

遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有些问题需要注意,

1、Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。

2、Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。

3、和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。

用好Category可以充分利用Objective-C的动态特性,编写出灵活简洁的代码。

—Protocol—

下面我们再来看Protocol。

Protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式。你通过Protocol定义各种行为,在不同的场景采用不同的实现方式。在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。

定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。例如:

@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;

@optional
- (id) submitOrder: (NSNumber *) orderid;
@end

以上代码可以单独放在一个h文件中,也可以写在相关类的h文件中,可以视具体情况而定。该Protocol包含两个方法,processSuccessful和submitOrder。这里还有两个关键字,@required和@optional,表示如果要实现这个协议,那么processSuccessful方法是必须要实现的,submitOrder则是可选的,这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。

那么如何实现这个Protocol呢,很简单,创建一个普通的Objective-C类,取名为TestAppDelegate,这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件,之后声明采用这个Protocol即可,如下:

@interface TestAppDelegate : NSObject<ProcessDataDelegate>;

@end

用尖括号(<...>)括起来的ProcessDataDelegate就是我们创建的Protocol。如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。例如<ProcessDataDelegate,xxxDelegate>

m文件如下:

@implementation TestAppDelegate

- (void) processSuccessful: (BOOL)success{
    if (success) {
        NSLog(@"成功");
    }else {
        NSLog(@"失败");
    }
}

@end 

由于submitOrder方法是可选的,所以我们可以只实现processSuccessful。

Protocol一般使用在哪些场景呢?Objective-C里的Protocol和Java语言中的接口很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,则可以使用Protocol来描述它们的关系。不同的类,可以遵守同一个Protocol,在不同的场景下注入不同的实例,实现不同的功能。其中最常用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件,都是通过委托的方式交给Controller完成。根据约定,框架中后缀为Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用时大家可以留意一下,体会其用法。

使用Protocol时还需要注意的是:

1、Protocol本身是可以继承的,比如:

@protocol A
     -(void)methodA;
@end
@protocol B <A>
     -(void)methodB;
@end

如果你要实现B,那么methodA和methodB都需要实现。

2、Protocol是类无关的,任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol,还可以使用conformsToProtocol进行判断,如下:

[obj conformsToProtocol:@protocol(ProcessDataDelegate)] 

好吧,具体的语言特性这次就介绍这么多。从某种意义上来说,Objective-C是一门古老的语言,发明于1980年。1988年,乔布斯的Next公司获得了Objective-C语言的授权,并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库,后来的事大家都清楚,苹果买了Next,乔布斯回归苹果,开始神奇的苹果振兴之路,NextStep成了Max OS X的基础。以后发展越来越好,Objctive-C成了Apple的当家语言,现在基本上是Apple在维护Objctive-C的发展。

在苹果的AppStore推出之前,Objective-C一直相对小众,但是其优秀的语言特性似乎一直在为后面的爆发积蓄力量,当苹果平台级的应用出现之后,Objective-C开始大放异彩,静态语言的效率和动态语言的特性得到众多程序员的喜爱,目前它已经以火箭般的速度蹿升TIOBE语言排行版第四位。

对于喜爱苹果技术的技术人员来说,Objective-C是你必须深入了解和值得学习的一门语言,希望以后有机会多写一些相关的文章。

 

Extension

extension可以 理解成匿名的category,同样需要括号。
下面就是隐藏私有实现的一个例子,也是extension一个常用的方式。

@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

extension 常常被用来限定属性的访问权限。比如一个属性提供对外可读,但是对内要可读可写。就用extension实现。
时间: 2024-12-20 09:20:49

基本语法 protocols Category extension的相关文章

Objective-C语法之扩展(Extension)的使用

Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法:允许一个对象可以拥有一个私有的@interface,且可由编译器验证 公开只读.私有可写的属性(Publicly-Readable, Privately-Writeable Properties) 实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter方法修改对象的

类的扩展(Extension , NSData, NSDateFormatter, Category, Extension, Protocol, delegate)

类的扩展         OC数据类型         1.NSInteger, NSUInteger         2.CGFloat         3.NSString, NSMutableString         4.NSArray, NSMutableString         5.NSNumber         6.NSDictionary, NSMutableDictionary         7.NSSet, NSMutableSet              NSD

category extension

1 category 分类,只能添加方法,添加的方法成为原来类的一部分,达到扩展类的目的,可以被子类继承 主要给没有源代码的类 添加方法,团队合作项目互不影响,不该动原有类的基础上添加方法 self 谁调用 self就是谁  灵活运用self  省去很多参数 NSString *str4 = @"vayydy"; NSString *str5 = [str4 getStringOneWord]; NSLog(@"%@" , str5); - (NSString *)

OC语法9——Category分类

Category(分类): 当我们在开发过程中要给类添加新的方法时,一般不要去动原类. 再不改动原类的限制下,怎么拓展类的方法?以往我们的做法是新建子类使其继承该类,然后通过子类拓展类的行为. OC提供了一种全新的方法:Category(分类).在不改动原类的基础上动态的拓展类的行为. 假如我们要动态拓展Student类,则应该建一个分类(Category),注意:文件命名要有规范,Student+StuOthers.h 格式:只要在被扩展的类名(原类)后加(),在括号里写分类名(拓展类名):

Category和Extension

转: http://blog.csdn.net/leikezhu1981/article/details/19091049 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类). 二.示例 1.声明类别 @interface NSSt

ios中的category与extension

ios中的category与extension Objective-c中提供了可以让我们扩展类定义的手段:类目,延展和协议. 类目:为已知的类增加新的方法: 延展:通知在本类的定义里使用类目来声明私有方法,和实例变量: 协议:协议声明了可以被任何类实现的方法.注意:这些手段只能增加类的方法,并不能用于增加实例变量(延展除外),要增加类的实例变量,只能通过定义子类来间接实现.1.类目1)声明类目@interface NSString (NumberConvenience)-(NSNumber *)

iOS学习笔记06—Category和Extension

iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类). 二.示例 1.声明类别 @interface NSString (CategoryDemo) -(NSNumber*)

Swift 基本语法2

一.?和! 1.可选类型: ? 在swift中,可选类型(?)其根源是一个枚举型,里面有None和Some两种类型.其实所谓的nil就是Optional.None, 非nil就是Optional.Some. ! 代表强制解包 1 // MARK: - ?和! 2 // ?代表可选类型,实际上的值是枚举类型 -- None和Some,其实nil值相当于Optional.None,非nil就是Optional.Some 3 // !代表强制解包 4 5 // 定义一个Int类型的可选类型变量 6 v

Swift开发语法

Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工具部门总监 Chris Lattner(克里斯·拉特纳) 开始着手 Swift 编程语言的设计工作 用一年时间,完成基本架构 Swift 大约历经 4 年的开发期,2014 年 6 月发表 克里斯·拉特纳 ) 特色 苹果宣称 Swift 的特点是:快速.现代.安全.互动,而且明显优于 Object