首页
/
每日頭條
/
圖文
/
ios怎麼設置多個協議
ios怎麼設置多個協議
更新时间:2026-04-22 00:14:21

首先,協議(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
推荐阅读
最年輕起兵稱帝的是誰(4位對手中有個曾4度稱帝)
最年輕起兵稱帝的是誰(4位對手中有個曾4度稱帝)
  第36屆香港電影金像獎頒獎典禮将于2017年4月9日晚舉行,此前,香港金像獎對外公布了提名名單,對于今年的提名,阿歪是沒感到多少意外的,畢竟現在稱得上是香港電影的影片也沒多少,在這裡面能當參賽的作品也就更少了,所以阿歪在看電影的時候基本上就能猜到這部片能不能被提名最佳影片,這個主角能不能被提名最佳男主。不過,意料之外的事還是有的,《七月與安生》這部影片雖...
2026-04-22
元啟為什麼是白絕兒子(千古玦塵後池生了個兒子)
元啟為什麼是白絕兒子(千古玦塵後池生了個兒子)
  由周冬雨、許凱領銜主演,張嘉倪、劉學義等主演的古裝玄幻仙俠劇《千古玦塵》正在熱播當中。   現如今,該劇已經開啟了超前點播,正片直接從原本的第二十八集更新到了三十八集,預告片也順帶着更新到了第四十四集。      後池生了個兒子根據四十三集和四十四集的預告片來分析,後池已經覺醒為主神上古。   她身為後池時所生的兒子也已經長大。   不似四十二集的預告片...
2026-04-22
道德經第三十二章個人理解(道德經二十五章)
道德經第三十二章個人理解(道德經二十五章)
  今天我們來學習道德經的第二十五章。原文:   有物混成,先天地生。寂兮寥(liao二聲)兮,獨立而不改,周行而不殆,可以為天地母。吾不知其名,強字之曰道,強為之名曰大。大曰逝,逝曰遠,遠曰反。   故道大,天大,地大,人亦大。域中有四大,而人居其一焉。人法地,地法天,天法道,道法自然。   為了節約時間,原文我就不念了,接下來直接翻譯一下這章:     ...
2026-04-22
奔跑吧第一季陣容官宣(奔跑吧全新陣容合體亮相春推會)
奔跑吧第一季陣容官宣(奔跑吧全新陣容合體亮相春推會)
  3月28日,全新一季《奔跑吧》家族的七位成員李晨、Angelababy、鄭恺、朱亞文、王彥霖、黃旭熙、宋雨琦合體亮相浙江衛視春推會,兄弟團相聚一堂,其樂融融、笑聲不停。現場還有《王牌對王牌》家族沈騰、賈玲、華晨宇、關曉彤歡樂集結,更有《中國好聲音》全新導師王力宏驚喜出席,浙江衛視新年的亮相可謂是全員出動大陣仗了。      超長花絮引爆全場,李晨撕名牌以...
2026-04-22
金龜子講的睡前小故事(金龜子講睡前故事)
金龜子講的睡前小故事(金龜子講睡前故事)
        呼噜豬,真好笑,每天早上都要睡懶覺。   叮鈴鈴,鬧鐘響,呼噜豬翻了個身又睡過去了。媽媽一遍一遍地喊,爸爸一次一次地叫,呼噜豬蒙上被子都沒有聽到。   當鬧鈴又響了一次時,呼噜豬突然從床上起來,糟糕糟糕,今天可千萬别遲到啊。   呼噜豬沒洗臉,沒刷牙,左腳的鞋子還穿在了右腳上,慌慌張張地收拾書包,呼噜豬都快要急死了。   豬爸爸看着呼噜豬匆忙...
2026-04-22
Copyright 2023-2026 - www.tftnews.com All Rights Reserved