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部分就是向外部提供資料的部...