[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十三章 協議

來源:互聯網
上載者:User

標籤:objective-c   協議   ios開發   ios   

13.1 協議

正式協議:包含了方法和屬性的有名稱列表

注意:

  1. 採用協議後,類就要實現該協議的所有方法
  2. 通常情況下,一個協議只有少數幾個需要實現的方法.
  3. 在協議中,不會引用新的執行個體變數
13.11 聲明協議
  • NSCopying 協議
@protocol NSCopying- (id) copyWithZone: (NSZone *) zone;@end//如果採用了NSCopying協議,你的對象將會知道如何建立自身的副本
  • 繼承父協議
@protocol MySuperDuberProtocol <MyParentProtocol>@end//需要實現兩個協議中的所有方法

注意:協議中不會引入信新的執行個體變數

  • NSCoding 協議
@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 複製

複製的種類

  1. 淺層複製:只會複製指向引用對象的指標,對象總數不變,指標數目*2。
  2. 深層複製:複製引用的對象,對象總數*2。
13.21 複製engine對象
  • 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

注意:

  1. zone是NSZone類的一個對象,指向一塊可供分配的記憶體地區。
  2. 當向對象發送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版》第十三章 協議

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.