程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> objective-c中的@selector()和 c /c++的函數指針,objectivecselector

objective-c中的@selector()和 c /c++的函數指針,objectivecselector

編輯:C++入門知識

objective-c中的@selector()和 c /c++的函數指針,objectivecselector


先看tomcat裡用到的代碼:

    //然後開始動畫
    //把圖片放到animationImages,接受數組參數
    self.tom.animationImages = arrayImage;
    //設置時間間隔,81張圖,圖多就播的時間稍微長,否則短
    self.tom.animationDuration = arrayImage.count * 0.074;
    //設置重復次數
    self.tom.animationRepeatCount = 1;
    //開始動畫
    [self.tom startAnimating];
    //結束動畫,應該等等再清空
    [self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];

最後一句代碼,延遲加載 set 方法的過程。@selector(xxxx)的作用是找到名字為xxxx的方法。就是說去調用a對象的b方法,和[a b];的意思一樣,但是這樣更加動態一些。返回的類型是SEL,看方法說明的時候如果參數類型是SEL,那麼就是要接受@selector(xxxx)返回的值。

回憶:

objective-c 語法快速過(5)中的SEL數據類型

每個類的方法列表都存儲在類對象中,每個方法都有一個與之對應的SEL類型的數據,根據一個SEL類型的數據就可以找到方法的地址,進而調用方法。SEL類型的定義:

typedef struct objc_selector *SEL;

SEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址。找到方法地址就可以調用方法,其實發送的消息就是SEL。

具體這objc_selector結構體是什麼,取決與使用GNU的還是Apple的運行時, 在Mac OS X中SEL其實被映射為一個C字符串,可以看作是方法的名字,它並不指向具體方法實現(IMP類型才是)。

對於所有的類,只要方法名是相同的,產生的selector都是一樣的。

 

看官方文檔;

- (id)performSelector:(SEL)aSelector

把指定的消息發送給接收方,餅返回執行的結果,也就是說 perform(本身就有履行執行的意思)Selector :xxx,是執行名字為 xxx 方法的方法,只不過是間接去執行,通過 sel 參數(使用@selector(方法的名字)的返回sel 類型),找到方法。

 

看到這裡,發現@selector(methodName)非常類似 c 語言的函數指針的概念。

C語言中,可以把函數名直接賦給一個函數指針,而OC的類不能直接應用函數指針,這樣只能做一個@selector語法來取.它的return結果是一個SEL類型。這個類型本質是類方法的編號(函數地址)。

 

回憶函數指針:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved