IOS NSInvocation應用與理解

2021-09-23 20:58:16 字數 2957 閱讀 4220

ios中有乙個型別是sel,它的作用很相似與函式指標,通過performselector:withobject:函式可以直接呼叫這個訊息。但是perform相關的這些函式,有乙個侷限性,其引數數量不能超過2個,否則要做很麻煩的處理,與之相對,nsinvocation也是一種訊息呼叫的方法,並且它的引數沒有限制。這兩種直接呼叫物件訊息的方法,在ios4.0之後,大多被block結構所取代,只有在很老的相容性系統中才會使用,簡單用法總結如下:

一、初始化與呼叫

在官方文件中有明確說明,nsinvocation物件只能使用其類方法來初始化,不可使用alloc/init方法。它執行呼叫之前,需要設定兩個方法:setselector: 和setargument:atindex: ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

- (void)viewdidload

-(void)mylog

注意:簽名函式的引數數量要和呼叫函式的一致。測試後發現,當簽名函式引數數量大於被調函式時,也是沒有問題的。

呼叫多引數的方法,我們可以這樣寫: ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

- (void)viewdidload

-(void)mylog:(int)a parm:(int)b parm:(int)c

注意:1、這裡設定引數的index 需要從2開始,因為前兩個被selector和target占用。下面這樣寫也沒有任何問題: ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

- (void)viewdidload

-(void)mylog:(int)a parm:(int)b parm:(int)c

2、這裡的傳參方式必須是傳遞引數位址。

二、nsinvocation的返回值

nsinvocation物件,是可以有返回值的,然而這個返回值,並不是其所呼叫函式的返回值,需要我們手動設定: ?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

- (void)viewdidload

-(int)mylog:(int)a parm:(int)b parm:(int)c

注意:這裡的操作傳遞的都是位址。如果是oc物件,也是取位址。

三、關於記憶體

可以注意到- (void)retainarguments;這個方法,它會將傳入的所有引數以及target都retain一遍。

IOS NSInvocation應用與理解

ios中有乙個型別是sel,它的作用很相似與函式指標,通過performselector withobject 函式可以直接呼叫這個訊息。但是perform相關的這些函式,有乙個侷限性,其引數數量不能超過2個,否則要做很麻煩的處理,與之相對,nsinvocation也是一種訊息呼叫的方法,並且它的引...

makefile 工程管應用理器

makefile工程管理器 已有addressbook.c main.c addressbook.h 檔案 建立vim makefile 檔案 m要大寫 寫makefile具體內容 在終端是輸入make 相當於在終端輸入gcc addressbook.c main.c makefile 檔案相當於經...

ContentProvider的用法與理解

contentprovider是用來分享資料的乙個標準介面,所以在使用上它分為3部分 中間部分就是乙個註冊,在manifest中加provider,由主機名和路徑組陳,表示全球唯一的乙個繼承了contentprovider並實現了抽象方法的類 contentprovider部分就是向外部提供資料的部...