1. 程式人生 > >Objective-C類方法中使用self注意事項

Objective-C類方法中使用self注意事項

        類方法中使用self會是什麼結果,下午在編碼中遇到這個問題:“在類方法中直接使用了self,導致函式沒有被呼叫。”然後,順便研究了一下,在類(或例項)方法中self是如何表現的。

 第一、在類方法中使用self作為引數,需要特別注意。

 第二、在類(或例項)方法中使用self呼叫方法(如果是錯誤的使用,編譯器會給出編譯錯誤)。

第一種情況:在類方法中使用self作為引數

一般來說:當引數指定型別,程式設計師傳入的self也是對應型別。但是,編譯器給出警告。

編譯器提示開發者:把Class當做TabBarController使用了

另外一種情況:如果引數是id型別,那麼編譯器不報錯。如下程式碼:
+ (void)goToInfoPage{
    RequestItem *requestItem = [[RequestItem alloc] initWithOwner:[TabBarController sharedInstance]];/*使用self可以編譯,但達不到預期效果*/
    [requestItem setDelegateTarget:[TabBarController sharedController] /*使用self可以編譯,但達不到預期效果*/ succeedMethod:@selector(requestInfoSuccess:) failedMethod:@selector(requestInfoFailure:)];
}

其中 initWithOwner和setDelegateTarget的引數都是id型別,上面的程式碼使用self可以通過編譯,但在request後,requestInfoSuccess和requestInfoFailure一個都沒有被執行。在initWithOwner函式中列印引數的值如下:
————使用self————
(lldb) po delegate
TabBarController

————使用[TabBarController sharedInstance]————
(lldb) po delegate
<TabBarController: 0x18952020>

很明顯:使用self,實際上是Class型別,並不是我們期望的類物件。所以,在RequestItem裡面判斷response selector的時候就沒有判斷出來。

針對第二種場景:在類(例項)方法中使用self呼叫方法

1. 例項方法中,self【可以】呼叫例項方法(最常見)
2. 例項方法中,self【不可以】呼叫類方法,此時self不是Class。【編譯錯誤】No visible @interface for 'xx' declares the selector ‘xx’
3. 類方法中,self【可以】呼叫類方法,此時self是Class
4. 類方法中,self【不可以】呼叫例項方法。【編譯錯誤】 No known class method for selector ‘xxxxx’

self跟著函式的本質不同,也會不同。所以,在類方法中使用self,就要特別注意了。

【總結】:

1,例項方法裡面的self,是物件的首地址。
2,類方法裡面的self,是Class。類方法不可以使用例項變數,但可以使用self,因為self不是例項變數。此時.self是Class
儘管在同一個類裡面的使用self,但是self卻有著不同的解讀。在類方法裡面的self,可以翻譯成class self;在例項方法裡面的self,應該被翻譯成為object self。在類方法裡面的self和例項方法裡面的self有著本質上的不同,儘管他們的名字都叫self。

相關推薦

Objective-C方法使用self注意事項

        類方法中使用self會是什麼結果,下午在編碼中遇到這個問題:“在類方法中直接使用了self,導致函式沒有被呼叫。”然後,順便研究了一下,在類(或例項)方法中self是如何表現的。  第一、在類方法中使用self作為引數,需要特別注意。  第二、在類(或例項

Objective-C方法 load 和 initialize

object mage cnblogs 什麽 類方法 color ech 引用 https 1、區別:+load 是只要類所在文件被引用就會被調用,而 +initialize 是在類或者其子類的第一個方法被調用前調用。所以如果類沒有被引用進項目,就不會有 +load 調用;

Objective C方法load和initialize的區別

1 +(void)load會引發+(void)initialize 2 /******* Interface *******/ 3 @interface SuperClass : NSObject 4 @end 5 6 @interface ChildClass : SuperClass 7

objective-c 和物件靜態資料成員和靜態成員函式(方法)詳解

作為初學者,相信大家都對objective-c的靜態資料成員和靜態成員函式都挺糾結的,我現在和大家分享下我對這個知識點的理解,請大家多多指點.... 如果大家學過C++,那麼都應該知道和了解靜態資料成

移動端網頁佈局需要注意事項以及解決方法總結

  移動端網頁佈局中需要注意事項以及解決方法總結,這份對我們在佈局移動端網頁的時候非常有用! winphone系統a、input標籤被點選時產生的半透明灰色背景怎麼去掉 <meta name="msapplication-tap-highlight"&nbs

Objective-c 方法學習筆記

@interface Shape : NSObject { ShapeColor fillColor; ShapeRect bounds; } - (void) setFillColor: (ShapeColor) fillColor; - (void) setB

Python-淺談方法Self

背景 一入Python深似海,最近也不知怎滴。迷戀上了Python,感覺這玩意兒越看越有意思,本來是打算看完初級基本教程再來個總結的,誰知半路殺出個Self,使我不得不趕緊記錄一下此刻的小小感悟!哈哈,

TransactionScope事務處理方法介紹及.NET Core注意事項

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/10170712.html 今天在寫CzarCms的UnitOfWork的使用使用到了這個TransactionScope事務,因此對它進行了相關資料的查閱並記錄如下,希望對大夥在.NET Core中使

c++11 注意事項

1. C++11標準中讓類的解構函式預設也是noexcept(true)的。 但如果顯式地為解構函式指定了noexcept,或者類的基類或成員有noexcept(false)的解構函式,解構函式就不會再保持預設值。 2. 初始化成員變數: c++98中,支援在類宣告中使用等號“=”進行初始化,但要求必須為

Eclipse檢視Java原始碼的方法及一些注意事項

在Eclipse中我們可以通過同時按Ctrl鍵點選要檢視的類或方法,就可以檢視該類或方法的原始碼了。但是,這是需要有前提的,那就是,我們有原始碼,並且配置了Eclipse的正確的查詢路徑。 我們可以通過下面的方法檢視及修改Eclipse中檢視原始碼的路徑。 現在我們把

java之資料包裝和封裝於開發注意事項

  最近在開發中的時候,在使用資料比較的時候。總是出現預想之外的結果。排查的時候,很容易忽略 。經過一番深究,總算有點體會了!! 我們都知道在java中資料有8種基本資料型別及其包裝類  1、基本型別:byte 二進位制位數:8 2、包裝類:java.lang.Byte 3

Objective-C】OC自動釋放池的基本概念和使用方法

自動釋放池的基本概念      cocoa中有一個自動釋放池(Autorelease Pool)的概念,顧名思義,它是可以存放一些實體的 集合,在這個自動釋放池中的物件,是能夠被自動釋放的。

C/C++常用巨集定義,注意事項,巨集#和##的用法

總結下巨集和函式的不同之處,以供大家寫程式碼時使用,這段總結摘自《C和指標》一書。 當然巨集定義非常重要的,它可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。 下面列舉一些成熟軟體中常用得巨集定義 1,防止一個頭檔案被重複包含 #ifndef COMDEF_H 

Objective-C】OC的繼承

1:為什麼要有繼承關係?   定義一個通用的類,它又基本的例項變數。子類可以繼承了該類,就可以擁有這些例項變數。子類也可以定義自己的例項變數。   被繼承的類叫超類或者父類(supercl

C++函式模板使用注意事項

舉個例子: template <typename elemType> void display_message(const string &msg,const vector<elemType> &vec) { c

python方法self關鍵字

之前學python爬蟲的時候要把函式封裝到類裡面,寫成類方法,知道在python的類方法中第一個引數應該是self,但對self代表的具體意義不甚了了。最近在看Java,對面向物件程式設計的瞭解更多了一點,終於徹底弄明白self到底是什麼了。 Pyth

找到第三方庫objective-C沒公開的函式並使用NSInvocation呼叫這個函式

近來做到一個專案,用到一個第三類,裡面的引數是readonly的, 這個第三方庫只有標頭檔案,並沒有實現程式碼 裡面的引數在呼叫一個類方法後就固定了。 但引數裡面的預設值不是我想要的,但是這個引數屬性是readonly的,怎麼辦。 首先確認一下有沒有對應的setter方法

objective-c

屬性 語法 obj imp 成對 組成 inter 布爾類型 -c Object C自己定義了布爾類型:BOOL。它可以取兩個值:YES 和 NO BOOL(無符號char型) 有兩個屬性 YES 跟 NO (1 RO 0) 類是由兩個部分組成的,1是類的聲明部分.

專案配置過程注意事項

所有人將防火牆永久性關閉,防止出現拒絕訪問情況 systemctl status firewalld 檢視狀態 systemctl stop firewalld 暫時關閉防火牆 systemctl disable firewalld 永久關閉 當遇到maven依賴報錯且不下載的時候,在倉

golangrange在slice和map遍歷注意事項

package main import ( "fmt" ) func main() { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for _,v :=range slice{ if v==1 {