OC学习7——类别、扩展和协议
1、我么在調(diào)用NSLog()方法打印一個(gè)對(duì)象時(shí),實(shí)際上是調(diào)用了該對(duì)象的description方法,這個(gè)description方法就和Java中的toString()方法一樣。所以,下面兩行代碼其實(shí)是一樣的
NSLog(@"%@", p) ; NSLog(@"%@", [p description]) ;description方法是NSObject類的一個(gè)實(shí)例方法,所有的OC都是NSObject類的子類,因此,所有的類都有description方法。description方法方法通常用于實(shí)現(xiàn)這樣的一個(gè)功能:當(dāng)程序員直接打印該對(duì)象時(shí),系統(tǒng)將會(huì)輸出該對(duì)象的“自我描述”信息,用以告訴外界該對(duì)象具有的狀態(tài)信息。NSObject類提供的description方法總是返回<FKPerson:十六進(jìn)制的首地址>,這個(gè)返回值并不是先自我描述的功能,因此,如果用戶需要自定義類實(shí)現(xiàn)自我描述的功能,則必須重寫NSObject類的description方法。
2、==與isEqual()方法的區(qū)別(這一點(diǎn)與Java中的異同點(diǎn)是一致的):
- ==:如果是比較對(duì)象是兩個(gè)基本類型,則數(shù)值相同就返回true,不同則返回false。如果比較對(duì)象是兩個(gè)指針變量,則如果兩個(gè)指針都指向同一個(gè)對(duì)象則返回true,否則返回false。
- isEqual():該方法是NSObject類提供的一個(gè)實(shí)例方法,因此所有指針變量都可以調(diào)用這個(gè)方法來判斷是否與其他指針變量相等。在默認(rèn)情況下,isEqual()的判斷方法和==一樣。如果希望采用自定義的相等標(biāo)準(zhǔn),則可以通過重寫isEqual()方法來實(shí)現(xiàn)。NSString已經(jīng)重寫了isEqual()方法,NSString的isEqual()方法判斷兩個(gè)字符串相等的標(biāo)準(zhǔn)是:只要兩個(gè)字符串包含的所有的字符序列相同,則isEqual()返回true,否則返回false。
3、OC中沒有像Java和C++那樣提供抽象類的語法支持,而在實(shí)際項(xiàng)目開發(fā)中,總有需要用到抽象類的時(shí)候,此時(shí)就會(huì)選擇定義一個(gè)父類,并以該父類派生出多個(gè)子類,其他程序使用這些類時(shí),實(shí)際上返回的是子類的實(shí)例,這一系列的類被稱為一個(gè)類簇(cluster),這個(gè)父類就模擬了抽象類的功能。
OC的動(dòng)態(tài)特性允許使用類別(category)為現(xiàn)有的類添加新房,并且不需要?jiǎng)?chuàng)建子類,不需要訪問原有類的代碼。通過使用類別就可以動(dòng)態(tài)地為現(xiàn)有的類添加新方法,而且可以將類定義模塊化地分不到多個(gè)文件中。類別同樣由接口和實(shí)現(xiàn)部分組成,接口和實(shí)現(xiàn)部分語法格式如下:
@interface 已有類 (類別名) //方法定義,類別中只能添加方法,不能添加成員變量 。。。 @end@implementation已有類 (類別名) //方法實(shí)現(xiàn) 。。。 @end- 類別名的命名很隨意,我們自己取定就可以,一般用于描述增加部分的功能
- 通過類別為制定的類添加新方法之后,這個(gè)新方法不僅會(huì)影響到該類,還會(huì)影響到該類的所有子類,每個(gè)子類都會(huì)獲得類別擴(kuò)展的方法。
- 可根據(jù)需要為一個(gè)類定義多個(gè)類別,不同的類別都可對(duì)原有的類增加方法的定義。
- 就編程習(xí)慣而言,一般習(xí)慣將類別的接口文件命名為“類名+類別名.h”的形式,同樣,實(shí)現(xiàn)文件則命名位“類名+類別名.m”的形式。 //接口部分 #import <Foundation/Foundation.h>@interface NSArray (Convert)+(NSMutableArray *)arrayFormNumber:(int)number;@end//實(shí)現(xiàn)部分 #import "NSArray+Convert.h"@implementation NSArray (Convert)+(NSMutableArray *)arrayFormNumber:(int)number{NSMutableArray *numberArray=[[NSMutableArray alloc]init];while (number) {int last=number%10; //取出最后一位;number=number/10;[numberArray addObject:[NSNumber numberWithInt:last]]; }return [numberArray autorelease]; }@end
- 使用類別可以對(duì)類進(jìn)行模塊化設(shè)計(jì):在前面類的設(shè)計(jì)中,類的接口部分在.h文件中定義,類的實(shí)現(xiàn)部分在.m文件中定義,且類的實(shí)現(xiàn)不能分布到多個(gè).m文件中。但是當(dāng)某個(gè)類特別大時(shí),如果將所有實(shí)現(xiàn)都放在一個(gè).m文件中,將會(huì)導(dǎo)致這個(gè)文件非常大,以至于維護(hù)起來非常困難。如果將一個(gè)較大的類進(jìn)行分模塊設(shè)計(jì),使用類別是一個(gè)不錯(cuò)的選擇。例如NSWindow類就采用這種設(shè)計(jì)思想,具體可以在xcode上查看NSWindow.h文件。
- 使用類別來實(shí)現(xiàn)私有方法的調(diào)用:OC中實(shí)際上并沒有真正的是有方法,通常而言所說的私有方法指的是沒有在接口部分定義而在實(shí)現(xiàn)部分定義的方法,這類方法是不允許被調(diào)用的,因?yàn)闆]有通過接口部分向外暴露調(diào)用接口。在OC中,除了通過NSObject類的performSelector()來執(zhí)行動(dòng)態(tài)調(diào)用從而實(shí)現(xiàn)調(diào)用私有方法之外,我們還可以通過使用類別來定義前向引用(其實(shí)就是通過類別在接口部分補(bǔ)充定義之前未定義的私有方法),從而實(shí)現(xiàn)對(duì)私有方法的調(diào)用。
4、OC中的擴(kuò)展(extension)和類別相似,擴(kuò)展相當(dāng)于匿名類別,不同的是擴(kuò)展可以定義實(shí)例變量。定義擴(kuò)展的語法格式如下:
@interface 已有類 () {//定義實(shí)例變量 } //方法定義 。。。 @end- 在語法上,擴(kuò)展相當(dāng)于匿名類別。但是在用法上,類別通常是有單獨(dú)的.h和.m文件,而擴(kuò)展則用于臨時(shí)對(duì)某一個(gè)類的接口進(jìn)行擴(kuò)展,類實(shí)現(xiàn)部分同時(shí)實(shí)現(xiàn)類接口部分和擴(kuò)展中定義的方法。
- 在類的擴(kuò)展中,可以額外增加實(shí)例變量,也可以用@property來合成屬性,但是在定義類別是則不允許定義成員變量,也不能用@property合成屬性。 1 #import "vehicle.h" 2 @interface Vehicle () 3 @property(nonatomic, strong) NSString *color; 4 -(void) drive:(NSString *)name; 5 @end 6 7 //在實(shí)際使用中,通用的做法是省略掉Vehicle_ext.h文件,而是將其中的內(nèi)容直接添加在Vehicle.m文件@implementation前部即可 8 #import "Vehicle_ext.h" 9 @implementation Vehicle 10 -(void) drive:(NSString *)name 11 { 12 NSLog(@"交通工具名稱%@,顏色屬性%@",_name,_color); 13 } 14 @end
5、協(xié)議(protocol)是OC的一個(gè)重要知識(shí)點(diǎn),其作用類似于Java中的接口,用于定義多個(gè)類應(yīng)該遵循的規(guī)范。協(xié)議提提供任何實(shí)習(xí)那,協(xié)議體現(xiàn)的是規(guī)范和實(shí)現(xiàn)分離的松耦合的設(shè)計(jì)哲學(xué)。
協(xié)議定義的是多個(gè)類共同的公共行為規(guī)范,這些行為是與外部交流的通道,這就意味著協(xié)議里通常是定義一組公用方法,但是不會(huì)為這些方法提供實(shí)現(xiàn),方法的實(shí)現(xiàn)則交給類去完成。協(xié)議定義時(shí)使用@protocol關(guān)鍵字,在協(xié)議中還有兩個(gè)關(guān)鍵字@optional and @required,@optional 聲明的方法可以實(shí)現(xiàn),也可以不實(shí)現(xiàn)。@required聲明的方法必須實(shí)現(xiàn)。具體語法格式如下:
// 定義的協(xié)議名稱 遵守協(xié)議名稱 @protocol MyProtocol <NSObject> @required //定義必選方法 @optional //定義可選方法@end//使用協(xié)議 @interface 類名 :父類 <協(xié)議1,協(xié)議2 ... >- 一個(gè)協(xié)議可以有多個(gè)直接父協(xié)議,但協(xié)議只能繼承協(xié)議,不能繼承類
- 學(xué)一種定義的方法只有方法簽名,沒有實(shí)現(xiàn)。協(xié)議中的方法既可以是類方法,也可以是實(shí)例方法。 1 // 2 // Women.h 3 // 正式協(xié)議的定義 4 // 5 // Created by Goddog on 15/1/11. 6 // Copyright (c) 2015年 Goddog. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @protocol Women <NSObject> 12 //定義協(xié)議的方法 13 @optional //可以不實(shí)現(xiàn)該接口的方法 14 -(void) pretty; 15 @required //必須實(shí)現(xiàn)該接口的方法 16 -(void) beautiful:(NSString*) count; 17 @end 正式協(xié)議的定義Women.h 1 // 2 // Man.h 3 // 正式協(xié)議的定義 4 // 5 // Created by Goddog on 15/1/11. 6 // Copyright (c) 2015年 Goddog. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @protocol Man <NSObject> 12 //定義協(xié)議的方法 13 -(void) handsome; 14 @end 正式協(xié)議的定義 Man.h?
轉(zhuǎn)載于:https://www.cnblogs.com/mukekeheart/p/7357437.html
總結(jié)
以上是生活随笔為你收集整理的OC学习7——类别、扩展和协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u启动怎么恢复u盘的数据 如何在u启动中
- 下一篇: 笔记本电脑怎么改u盘启动不了 笔记本电脑