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

首先,協議(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
推荐阅读
一拳十大最強s級英雄(新英雄協會12位S級解析)
一拳十大最強s級英雄(新英雄協會12位S級解析)
  關注ONE老師原作版一拳超人漫畫的小夥伴,想必對新英雄協會NEO并不陌生。作為英雄協會的對家,它不僅網羅了脫離英雄協會的原S級英雄,更有一些已出場人物的關系者包括在其中。本篇拾溜就來介紹将成為新英雄協會的12位S級英雄的強力角色,内容僅供參考。      殺手艾(殺し屋エー)   成為英雄之前,他是特A級懸賞犯,雖然相比S級的索尼克低一級,他仍擁有對于擊...
2026-04-09
那些年看過的超好看的泰劇(這些甜到令人心動的泰劇你看過嗎)
那些年看過的超好看的泰劇(這些甜到令人心動的泰劇你看過嗎)
  最近飯哥發現了一部高顔值的泰劇《逐月之月》,這部劇剛開始光看劇照就被男主的顔值迷得不要不要的~雙向暗戀的設定簡直太戳萌點了,現在隻更新到第二集,等待更新日子太難熬。同時呢,飯哥也整理了幾部同樣甜到令人心動的泰劇,和大家一起分享。   《逐月之月》   《逐月之月》根據泰國暢銷小說《Two Moons》改編,主要講述了一個理工學院院草暗戀校草學長的故事,由...
2026-04-09
最新韓國古裝高分b級電影推薦(豆瓣8.3分的R級片)
最新韓國古裝高分b級電影推薦(豆瓣8.3分的R級片)
  美輪美奂的西部風景,動聽悅耳的音樂,六則寓意深刻的故事娓娓道來,看科恩兄弟的新作,再一次被故事的強烈宿命感震撼到,看完回味無窮。   時隔兩年,伊桑·科恩和喬爾·科恩終于又帶來一部新作《巴斯特·斯克魯格斯的歌謠》,看片名差點以為是紀錄片,又或者歌舞片。      《巴斯特·斯克魯格斯的歌謠》在豆瓣評分高達8.3分,好于92%的西部片,好于92%的喜劇片,...
2026-04-09
德語日常會話用語(德語學習我很性感)
德語日常會話用語(德語學習我很性感)
  Emil:Wo warst du? (你去哪了?)   Ich bin in die Toilette gegangen.:小明   Emil:Was zur Hölle?! (WTF?)   其實小明想說:Ich bin auf die Toilette gegangen. ——我剛去廁所了。。。   但是表達的實際意思卻是:我剛去了馬桶裡。     ...
2026-04-09
上坂堇配音龍女(知名聲優上坂堇加入)
上坂堇配音龍女(知名聲優上坂堇加入)
  美食拟人手遊《食之契約》本周公開了全新飨靈角色,受到了玩家們的廣泛關注和轉發,特别還邀請了知名聲優上坂堇加入為它配音,讓我們來看看《食之契約》缇爾菈大陸的大陸中這次加入了什麼樣的新飨靈角色呢?   【祈願庇佑 禦節料理】      美味的禦節料理相當于是日本人的年夜飯,它會用多層的盒子裝置,每一層裝置的不同的食物擁有着不同的寓意。第一層主要會有一些象征喜...
2026-04-09
Copyright 2023-2026 - www.tftnews.com All Rights Reserved