原文:
首先說明一下題目中的形如部分(nserror *__autoreleasing *),這部分可能剛開始看有點兒理解不了,其實就是這樣的(nserror **),這就表示乙個指向指標的指標,__autoreleasing是乙個修飾符,表示傳入的是乙個通過autorelease方法返回的id物件,這在記憶體管理中用到的。
我們都知道這樣乙個問題,將乙個基本資料型別的變數通過函式引數傳入函式內,在函式內如何改變,都不會影響到外部變數的值!如下**:
#import
void
test(
int
a)
int
main(
int
argc,
const
char
* argv)
return
0;
}
程式執行結果如下:
基本變數傳入函式執行結果
a的值還是等於5,說明函式傳遞的只是乙個5的值。那如果要在函式內部改變外部變數的值要怎麼辦呢?當然是用指標了,將指標的值傳入函式,然後在函式中根據指標去找到指向的記憶體中修改,**如下:
#import
void
test(
int
* a)
int
main(
int
argc,
const
char
* argv)
return
0;
}
再看看執行結果:
基本資料型別指標傳入函式結果
這時a的值是10了,我們傳入的是記憶體位址,然後在函式中對位址指向記憶體進行修改。
那麼,如果函式引數本身是乙個物件,我們傳入的是乙個物件,本身就是乙個位址,會怎樣呢?我們先新建乙個物件myobject,然後有乙個nsstring型別的name屬性,這個**我就不貼出來了,直接看main.m的**吧!
#import
#import "myobject.h"
void
test(myobject * obj)
int
main(
int
argc,
const
char
* argv)
return
0;
}
看看程式執行結果
物件指標傳入函式的結果
怎麼樣,輸出結果是xcoder studio,而不是web site。因為我們傳入函式的是obj這個指標,這個指標指向了記憶體中的乙個myobject物件,函式中obj.name改變的是這個物件的屬性,當函式中obj = [[myobject alloc] init];執行後,系統會在記憶體中新開闢一塊兒儲存空間儲存乙個新的myobject物件,然後將函式中的obj儲存的指標值改為這個新的記憶體位址,而函式外的obj指標並沒有改變,還是指向原來的這個物件的位址。
那麼我們如何實現在函式中改變函式外物件呢?就用乙個新的指標指向這個物件的指標,也就是我們說的指向指標的指標。**如下:
#import
#import "myobject.h"
void
test(myobject ** obj)
int
main(
int
argc,
const
char
* argv)
return
0;
}
執行結果如下:
指向指標的指標傳入函式引數的結果
這時候就實現了吧!
標題中所說的nserror *__autoreleasing *都是這樣的,我們可以在外面新建乙個nserror,當函式執行中有錯誤時,新建乙個nserror物件並儲存到我們新建的這個nserror物件中。我們就可以通過這個nserror是否為nil看函式執行是否出錯!
函式傳引數 python 函式引數
1.位置引數 最熟悉的一種引數形式,優點 簡單。缺點 傳遞引數不夠靈活 2.預設引數 優點 提高了 的復用性 缺點 容易產生二義性 注意事項 一是必選引數在前,預設引數在後。二是如何設定預設引數。當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。def p...
js 函式引數傳值 傳引用
基本數值型別 傳值 引用型別 嚴格來說不能算傳引用,在js中叫按共享傳遞 call by sharing也叫按物件傳遞 按物件共享傳遞。該策略的重點是 呼叫函式傳參時,函式接受物件實參引用的副本 既不是按值傳遞的物件副本,也不是按引用傳遞的隱式引用 它和按引用傳遞的不同在於 在共享傳遞中對函式形參的...
objective c 可變引數
容易發現cocoa foundation 中提供了一些可變引數的方法,如 nslog nsstring format,在實際的程式設計實踐中,我們也需要自己實現可變引數的方法。在objc中,是依靠原生c庫來的實現的。請看示例 1 void dolog nsstring formatstr,2223 ...