站在巨人的肩膀上展望遠方!
感謝:李剛老師的瘋狂iOS講義?。。?/p>
兩個概念:
形參:在聲明函數(shù)時使用的參數(shù)
實參:在調(diào)用函數(shù)時傳入的參數(shù)
一個本質(zhì):
OC函數(shù)的參數(shù)傳遞的本質(zhì)就是:值傳遞
值傳遞:將實參值的副本(復(fù)制品)傳入函數(shù)內(nèi),而實參本質(zhì)不會收到任何影響。
舉個栗子:
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
NSLog(@"swap---%d,%d",a,b);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 1;
int b = 2;
swap(a,b);//這里的a,b就是實參
NSLog(@"swap后---%d,%d",a,b);
}
return 0;
}
運行結(jié)果:
swap---2,1
swap后---1,2
原因:
當系統(tǒng)開始執(zhí)行函數(shù)時,系統(tǒng)為形參執(zhí)行初始化,就是把實參的值賦給函數(shù)的形參,函數(shù)里操作的并不是實際的實參值。
說人話:就是swap中的a,b只是main函數(shù)中a,b的復(fù)制品!當swap調(diào)用a,b時,是將main函數(shù)中的a,b的值復(fù)制進自己函數(shù)中給自己的a,b,所以改變時只會改變自己函數(shù)中的a,b。
來來來,我們把這顆栗子在加工一下:
@interface Person : NSObject
@property int a;
@property int b;
@end
#import <Foundation/Foundation.h>
#import "Person.h"
void swap(Person *p){//a,b就是形參
int temp = p.a;
p.a = p.b;
p.b = temp;
NSLog(@"swap---%d,%d",p.a,p.b);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
p.a = 1;
p.b = 2;
swap(p);//這里的a,b就是實參
NSLog(@"swap后---%d,%d",p.a,p.b);
}
return 0;
}
運行打?。?/p>
swap---2,1
swap后---2,1
哎哎哎,不是值復(fù)制嗎?為什么swap后p的值也變了呢???
這里就牽涉到一個概念:指針對象!p是什么?是Person類的實例化變量,它在main函數(shù)中儲存的是一個指針地址,這個地址指向的是Person對象!而當p作為實參傳給swap時,依然是值復(fù)制,只不過復(fù)制的是p的指針地址!意味著swap中的形參p也是一個指向Person的地址而已,所以再swap操作p,就是直接操作Person本身?。。。?br>
但是!但是!但是!swap中的p與main函數(shù)中的p是兩個變量!不信的話你可以在swap中NSLog后添加一個p = nil;看看mian函數(shù)中調(diào)用swap后p會不會變空。