首页
/
每日頭條
/
圖文
/
ios怎麼設置多個協議
ios怎麼設置多個協議
更新时间:2026-05-20 04:52:49

首先,協議(protocol)不是對象,是Objective-C的一種語法,用于聲明一組方法,約定調用者可以使用實現者的哪些方法。

協議不能被單獨實例化,隻能由類來明文聲明,并具體實現。

用Xcode8添加協議

基本步驟與iOS開發基礎:如何使用類别(Category) 相似,隻是文件類型選擇協議:

ios怎麼設置多個協議(iOS開發基礎協議代理)1

協議聲明:

ios怎麼設置多個協議(iOS開發基礎協議代理)2

@optional表示實現者可自由選擇是否實現;

@required表示必須實現。

聲明繼承協議:

ios怎麼設置多個協議(iOS開發基礎協議代理)3

協議不但可以繼承的,并且可以多繼承,在尖括号中用逗号分隔:

ios怎麼設置多個協議(iOS開發基礎協議代理)4

這裡NSObject是個協議名,并不是類名。如果實現者聲明XSProtocol,則需要同時實現NSObject, NSCopying兩套協議。

協議的實現:

如我們常用的UITableView的數據源和代理,可以用同一個類來實現:

ios怎麼設置多個協議(iOS開發基礎協議代理)5

@implementation部分,實現協議聲明的方法:

ios怎麼設置多個協議(iOS開發基礎協議代理)6

編譯器會告訴你哪些必要的(聲明為@required的)協議方法沒有實現:

ios怎麼設置多個協議(iOS開發基礎協議代理)7

協議的使用:

1. 指定對象需要實現的方法:

ios怎麼設置多個協議(iOS開發基礎協議代理)8

一看這樣的聲明,就知道該方法需要一個會編程的學生,

如果傳入一個普通的Student對象,會引發一個警告:

ios怎麼設置多個協議(iOS開發基礎協議代理)9

所以協議可以幫助我們寫出自我說明的代碼,并且編譯器會幫助我們檢查。

2. 調用時,先判斷被調用者是否實現某方法:

ios怎麼設置多個協議(iOS開發基礎協議代理)10

可能有些童鞋會想,每次調用方法前(即使不是協議方法)都調用一次respondsToSelector,不就萬無一失了嗎?很不幸,respondsToSelector會消耗較多的資源,降低程序的執行效率,因此建議新手在調用協議方法時必須進行檢查,等經驗積累後,再根據具體需要自行選擇是否檢查,比如需要提高性能時,可以緩存respondsToSelector的判斷結果。

什麼是代理?

代理(delegate)是A對象指定B對象處理某些特定任務的設計模式,這裡B對象就成為了A對象的“代理”。

ios怎麼設置多個協議(iOS開發基礎協議代理)11

在Objective-C中,協議是實現代理模式的一種方式,

協議提供了面向接口編程的一種方式,使用協議,調用者隻需關心被調用者是否能做某事,而不關心被調用者具體是誰。

這就是為什麼代理對象總是被聲明成id,也就是說,隻要實現了協議,任何類都可以成為代理。

理解了代理模式,這裡需要提醒使用協議的一個注意點:

聲明為代理的屬性,需要定義為 weak

ios怎麼設置多個協議(iOS開發基礎協議代理)12

因為B将自己聲明為A的代理,必然也會保留A,這樣相互保留的關系很容易形成“保留環”,造成内存無法釋放。

小結

協議是Objective-C 的一種語法,聲明了一套方法,而代理是一種設計模式,可以用協議來實現。

使用協議要注意三個問題:

  1. 指定對象需要實現的方法。

  2. 調用時,先判斷被調用者是否實現某方法。

  3. 聲明為代理的屬性,需要定義為 weak。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
七龍珠最後大決戰悟空vs弗利薩(龍珠新劇場版5細節)
七龍珠最後大決戰悟空vs弗利薩(龍珠新劇場版5細節)
  大家好,不知道大家有沒有看過龍珠最新的劇場版布羅利,小編發現其中的一些細節還是挺有趣的,所以今天就來跟大家分享一下吧,原來悟空的大智若愚,是從培養皿就已經開始了啊,而弗利薩在這部劇場版裡,也是各種賣萌,好不搞笑哈!      這部龍珠劇場版并沒有以悟空的視角開篇,而是先介紹了布羅利被放逐到偏遠的星球,過程可以省略一萬字,但是有一個細節,小編是比較在意的,...
2026-05-20
章子怡被吐槽生子後變老(章子怡曬參加青年影展Vlog)
章子怡被吐槽生子後變老(章子怡曬參加青年影展Vlog)
  章子怡參加FIRST青年影展曬出VLOG,她這次帶着小兒子去西甯,兒子才2歲多,還沒有上幼兒園,所以章子怡目前沒有接戲,基本上都是參加一些活動,這些活動都是可以帶孩子前往,因為有保姆照顧孩子,她也不是随時都要帶孩子在身邊。      章子怡取得很輝煌的成就,年入不惑,她也是以家庭為主,她比較挑劇本,在青年影展上表示,還是願意拿出三年的時間,給予電影給予角...
2026-05-20
兩個隐藏在你朋友圈裡的騙局(利用你的善良新出騙局)
兩個隐藏在你朋友圈裡的騙局(利用你的善良新出騙局)
  原創: 煙台網警巡查執法   你是不是也遇到過這種情況,朋友圈内熟人經常發布信息,讓你幫忙轉發,不轉吧,不好意思,可是卻明明知道是虛假的信息,如果轉發了,就會造成更多的不知情、或者老年人就容易上當進而受騙。今天煙台網警就帶大家了解一下常見的“朋友圈”騙局。      常見案例:   一、某某人重病,急需手術費等等的内容,本來一方有難四方幫助是挺好的,但現...
2026-05-20
紅旗l5跟勞斯萊斯路口相遇(勞斯萊斯街頭逆行)
紅旗l5跟勞斯萊斯路口相遇(勞斯萊斯街頭逆行)
  在馬路上逆行是非常危險的行為,因為每一條車道它有一個固定的走向,車子都隻能按照一個方向行駛,如果馬路上出現了一輛逆行的汽車,就會給其他車主帶來麻煩,也會擾亂交通秩序,所以交通部門對于逆行的車輛也會進行嚴查。勞斯萊斯街頭逆行,紅旗L5絲毫不讓,網友:碰上硬茬了。      可是有一些車主在開車的時候卻非常不注意遵守交通規則,哪怕是在一些車流量比較大的路段,...
2026-05-20
abb中的io控制指令有哪些(ABB停止指令StopExitBreak的區别)
abb中的io控制指令有哪些(ABB停止指令StopExitBreak的區别)
  ABB工業機器人STOP指令用于停止程序執行。在Stop指令就緒之前,将完成當前執行的所有移動。該指令的使用格式為:   Stop [ \NoRegain ] | [ \AllMoveTasks ];   如果STOP指令使用變量\NoRegain,若機械臂和外軸已遠離停止位置,則不會再返回;如果不使用變量\NoRegain,若機械臂和外軸已逐漸遠離停止...
2026-05-20
Copyright 2023-2026 - www.tftnews.com All Rights Reserved