標籤:objective-c 協議 ios開發 ios
13.1 協議
正式協議:包含了方法和屬性的有名稱列表。
注意:
- 採用協議後,類就要實現該協議的所有方法。
- 通常情況下,一個協議只有少數幾個需要實現的方法.
- 在協議中,不會引用新的執行個體變數。
13.11 聲明協議
@protocol NSCopying- (id) copyWithZone: (NSZone *) zone;@end//如果採用了NSCopying協議,你的對象將會知道如何建立自身的副本
@protocol MySuperDuberProtocol <MyParentProtocol>@end//需要實現兩個協議中的所有方法
注意:協議中不會引入信新的執行個體變數
@protocol NSCoding//將對象的執行個體變數轉換為NSCoding類的對象- (void) encodeWithCoder: (NSCoder *) aCoder;//從NSCoder類的對象中提取經過轉換的執行個體變數,並使用它們去初始化新的對象- (id) initWithCoder: (NSCoder *) aDecoder;@end
13.12 採用協議
@interface Car : NSObject <NSCopying, NSCoding>{ // 該類的對象可以對自身進行編碼解碼;能夠建立自身的副本}// methods@end // Car
13.2 複製
複製的種類
- 淺層複製:只會複製指向引用對象的指標,對象總數不變,指標數目*2。
- 深層複製:複製引用的對象,對象總數*2。
13.21 複製engine對象
@interface Engine : NSObject <NSCopying>@end // Engine
- engine類的聲明,採用了NSCopying協議,就必須實現conyWtihZone:方法
@implementation- (id) copyWithZone: (NSZone *) zone{ Engine *engineCopy; engineCopy = [[[self class] allocWithZone: zone] init]; return (engineCopy);} // copyWithZone
注意:
- zone是NSZone類的一個對象,指向一塊可供分配的記憶體地區。
- 當向對象發送copy訊息時,該copy訊息在到達你的代碼之前會被轉化為copyWithZone:方法。
[self class];//獲得self參數所屬的類,當前類,非子類
allocWithZone:是類方法:
+ (id) allocWithZone: (NSZone *) zone;
allocWithZone:
是類方法,分配記憶體並建立一個該類的新對象,返回一個保留計數器值為1且不需要釋放的對象。
init
:初始化新對象
13.22 複製Tire
Tire類(有兩個執行個體變數)的介面(採用NSCopying協議):
@interface Tire : NSObject <NSCopying>{ float pressure; float treadDepth;}// ... methods@end // Tire
實現copyWithZone:
方法
- (id) copyWithZone: (NSZone *) zone{ Tire *tireCopy; tireCopy = [[[self class] allocWithZone: zone] initWithPressure: pressure treadDepth: treadDepth]; return (tireCopy);} // copyWithZone
注意:這裡採用了Tire類的指定初始化函數,但不是必須的。在設定屬性不太可能跟涉及額外工作時,我們也可以使用簡單的init方法來初始化,用訪問器方法來修改對象的屬性。
13.23 複製AllWeatherRadial類(Tire類的子類)
@interface AllWeatherRadial : Tire- properties;- methods;@end
注意:此類是Tire類的子類,獲得了NSCopying協議。
- (id) copyWithZone: (NSZone *) zone{ AllWeatherRadial *tireCopy; tireCopy = [super copyWithZone: zone]; [tireCopy setRainHandling: rainHandling]; [tireCopy setSnowHandling: snowHandling]; return (tireCopy);} // copyWithZone
本代碼解釋:
This class just asks its super- class for a copy and hopes that the superclass does the right thing and uses [self class] when allocating the object. Because Tire’s copyWithZone: uses [self class] to determine the kind of object to make, it will create a new AllWeatherRadial.
13.24 複製Car類
//Car:@interface Car : NSObject <NSCopying>{ NSMutableArray *tires; Engine *engine;}// ... methods@end // Car
實現 copyWithZone:
方法:
//Car.m- (id) copyWithZone: (NSZone *) zone{ Car *carCopy; //self所屬的類分配新對象 carCopy = [[[self class] allocWithZone: zone] init]; carCopy.name = self.name; Engine *engineCopy; engineCopy = [[engine copy] autorelease]; carCopy.engine = engineCopy; int i; for (i = 0; i < 4; i++) { Tire *tireCopy; tireCopy = [[self tireAtIndex: i] copy]; [tireCopy autorelease]; [carCopy setTire: tireCopy atIndex: i]; } return (carCopy);}
13.25 參數類型:id
限定參數:接收的對象必須是接受的對象
-(void)setObjectValue:(id<NSCopying>) object;
13.3 Objective-C 2.0新特性
@protocol BaseballPlayer- (void)drawHugeSalary; //必須實現@optional- (void)slideHome;- (void)catchBall;- (void)throwBall;@required- (void)swingBat; //必須實現@end // BaseballPlayer
注意:
Cocoa中的非正式協議逐漸被替換成了帶有@optional方法的正式協議。
13.4 委託方法
委託:某個對象指定另一個對象處理某些特定任務的設計模式,委託要遵守協議
NSNetServiceBrowser類的委託方法:
-(id<NSNetServiceBrowserDelegate>)delegate;//返回當前的委派物件-(void)setDelegate:(id<NSNetServiceBrowserDelegate>)delegate;//設定委託:只有遵守該協議的對象才能被設定為委託
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十三章 協議