在新創(chuàng)建文件過程中
在File Type選項中有著Empty File、Category、Protocol、Extension四種類型的文件
首先簡單介紹一下創(chuàng)建出來文件
①創(chuàng)建Empty File文件,Class項不用填寫,只用填寫文件名,最終創(chuàng)建出來的文件: 文件名.m
該文件為空文件,內(nèi)部只有 (一個文件)
#import <Foundation/Foundation.h>
②創(chuàng)建Category(分類)文件,以文件名Test, Class為UIViewController為例,創(chuàng)建了兩個文件
有.h和.m文件
UIViewController+Test.h
#import <UIKit/UIKit.h>
@interface UIViewController (Test)
@end
UIViewController+Test.m
#import "UIViewController+Test.h"
@implementation UIViewController (Test)
@end
③創(chuàng)建Protocol(協(xié)議)文件,以文件名Test為例,Class項不用填寫.創(chuàng)建了一個文件.
Test.h
#import <Foundation/Foundation.h>
@protocol Test <NSObject>
@end
④創(chuàng)建Extension(延展/擴展)文件,,以文件名Test, Class為UIViewController為例,創(chuàng)建了一個文件 UIViewController_Test.h
#import <UIKit/UIKit.h>
@interface UIViewController ()
@end
接下來開始介紹Category(分類/類目)、Protocol(協(xié)議)蚜厉、Extension(擴展/延展)三者:
Category(分類/類目):
利用Objective-C的動態(tài)運行時分配機制恬汁,Category提供了一種比繼承更為簡潔的方法來對class進(jìn)行擴展,無需創(chuàng)建對象類的子類就能為現(xiàn)有的類添加新方法,可以為任何已經(jīng)存在的class添加方法顽铸,包括那些沒有源代碼的類。(只能新添加方法)
注意:
(1)無法向類中添加新的實例變量,類別沒有位置容納實例變量牺六。
(2)名稱沖突艘蹋,即當(dāng)類別中的方法與原始類方法名稱沖突時冯键,類別具有更高的優(yōu)先級枉昏。類別方法將完全取代初始方法從而無法再使用初始方法。
實際開發(fā)使用:
UINavigationBar+CustomHeight 在iOS 7和iOS 8上自定義UINavigationBar高度午衰。
https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2
UILabel+Attributed attributedLabel使用Core Text框架來設(shè)置行距和添加細(xì)節(jié)崖技。
https://github.com/self-creative/attributedLabel
還有其他Objective-C相關(guān)Category的收集
http://www.cocoachina.com/ios/20140926/9764.html
Protocol(協(xié)議):
協(xié)議冀瓦。類似C++中的虛類,只負(fù)責(zé)聲明拓提,不負(fù)責(zé)實現(xiàn)萨驶。其他子類繼承該虛類,需要實現(xiàn)虛類中的方法。
特點:協(xié)議多用在許多類同時使用相同的方法而且這些代碼重復(fù)性很大的情況下,它會把這些重復(fù)的代碼提煉出來放在一個協(xié)議里箩帚,供大家使用紧帕。它確實有些類似于java中的接口和C++中的純虛函數(shù)的抽象類,它提供協(xié)議的規(guī)則,使用者只有遵從協(xié)議的規(guī)則才能使用它所提供的方法恢准。當(dāng)然這些方法在協(xié)議中它只是幫助進(jìn)行了聲明馁筐,并沒有任何的實現(xiàn)赦抖。當(dāng)使用者遵從這個協(xié)議并使用它的方法時,如果在類聲明文件中方法都是默認(rèn)的或者是@required時要尔,那么在類實現(xiàn)文件中必須全部地實現(xiàn)這些方法救欧。如果是@optional標(biāo)記的,使用者可以選擇性的實現(xiàn)椎镣,視情況而定诈火。
過程:它只有.h聲明文件,它既可以作為一個單獨的文件進(jìn)行聲明所提供的方法状答,也可以直接放在類聲明文件中進(jìn)行聲明冷守,一般采用后者進(jìn)行聲明。它的方法聲明時有默認(rèn)惊科、@required拍摇、@optional三種情況。當(dāng)使用前面兩種時馆截,在類實現(xiàn)文件中必須全部地實現(xiàn)這些方法充活。如果是@optional標(biāo)記的,使用者可以選擇性的實現(xiàn)蜡娶,視情況而定混卵。當(dāng)它的方法沒有@optional時,那么它就類似于接口中的abstract整個類是抽象的,是必須全部實現(xiàn)所有的方法的。
格式:
@protocol 協(xié)議名:<父類協(xié)議名> =======>放在類的.h文件中或者在自己的單獨創(chuàng)建的.h文件中
{
method1窖张;//默認(rèn)的幕随,類實現(xiàn)文件中必須要實現(xiàn)這個方法
@required
method2; //需求的,類實現(xiàn)文件中必須要實現(xiàn)這個方法
@optional
method3;//可選擇的宿接,使用者可以選擇性的實現(xiàn)
}
@end
實際開發(fā)使用:利用協(xié)議可以實現(xiàn)代理模式赘淮。也就是給類尋找委托人,幫助類完成一些功能辕录,而類不用自己親自去做。這種代理模式使得代碼的靈活性提高,也降低了耦合性梢卸,不必向繼承那樣走诞,因為父類和子類的耦合性太強,父類一變化,子類就也得跟著變化蛤高,太過麻煩蚣旱。協(xié)議要求,不管使用者是誰戴陡,阿貓阿狗都行姻锁,只要遵從規(guī)則,就可以用協(xié)議的方法替類去完成委托的任務(wù)猜欺。類似于老板與秘書的關(guān)系:老板出差時,秘書給老板訂票拷窜、訂房开皿;老板開會時,秘書就負(fù)責(zé)通知所有要開會的人篮昧。赋荆。。
Extension(擴展/延展):
匿名的Category(特殊的)懊昨。類有時需要一些只為自己所見窄潭,所用的私有方法這種私有方法可以通過延展的方式來聲明,定義的方法在類本身的@implementation代碼區(qū)域中進(jìn)行實現(xiàn)酵颁。
與Category不同的地方:可增加私有屬性嫉你,聲明的方法必須實現(xiàn)。作用:將方法變?yōu)轭惖乃接蟹椒ā?它只有.h文件 (可以添加方法和實例變量)
注意:在類別(Category)中只能添加方法躏惋,方法都是公有的幽污;在類擴展(Extension)中,既可以添加方法,也可以添加實例變量,但是添加的內(nèi)容都是類私有的,只能在類的內(nèi)部訪問簿姨。
既然寫到這里,再把繼承也寫一下吧
繼承:
①特點: 繼承多用于一般父類中的方法功能比較齊全距误,子類從父類繼承過來使用,可以省略很多重復(fù)的代碼,不僅簡化了代碼扁位,而且也提高了代碼的復(fù)用性准潭。
②過程: 當(dāng)子類需要的方法和屬性在父類中找不到時,子類可以添加自己必要的方法和屬性,目的是對功能進(jìn)行擴充域仇;當(dāng)父類中有子類需要的方法刑然,但是方法中內(nèi)容并不能完成子類的需要時,子類可以重新實現(xiàn)這個同名的函數(shù),它會覆蓋父類的同名函數(shù)來實現(xiàn)子類的需要的內(nèi)容。
③格式:
@interface 類名 : 父類名 =====> .h聲明文件
{
屬性property;
}
//@property(參數(shù)1,參數(shù)2) 類型名 變量名殉簸;
方法method闰集;
@end
@implementation 類名 ======>.m實現(xiàn)文件
//@synthesize 變量名
{
實現(xiàn)方法method沽讹;
}
@end
④說明:
@property(參數(shù)1,參數(shù)2) 武鲁、@synthesize 變量名
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數(shù)意義如下:
readwrite: 產(chǎn)生setter\getter方法
readonly: 只產(chǎn)生簡單的getter,沒有setter爽雄。
assign: 默認(rèn)類型,setter方法直接賦值,而不進(jìn)行retain操作
retain: setter方法對參數(shù)進(jìn)行release舊值沐鼠,再retain新值挚瘟。
copy: setter方法進(jìn)行Copy操作,與retain一樣
nonatomic: 禁止多線程饲梭,變量保護(hù)乘盖,提高性能