站在巨人的肩膀上展望遠(yuǎn)方!
感謝:李剛老師的瘋狂iOS講義!<热啤!
兩個概念:
形參:在聲明函數(shù)時使用的參數(shù)
實(shí)參:在調(diào)用函數(shù)時傳入的參數(shù)
一個本質(zhì):
OC函數(shù)的參數(shù)傳遞的本質(zhì)就是:值傳遞
值傳遞:將實(shí)參值的副本(復(fù)制品)傳入函數(shù)內(nèi)涮坐,而實(shí)參本質(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就是實(shí)參
NSLog(@"swap后---%d,%d",a,b);
}
return 0;
}
運(yùn)行結(jié)果:
swap---2,1
swap后---1,2
原因:
當(dāng)系統(tǒng)開始執(zhí)行函數(shù)時袱讹,系統(tǒng)為形參執(zhí)行初始化疲扎,就是把實(shí)參的值賦給函數(shù)的形參,函數(shù)里操作的并不是實(shí)際的實(shí)參值捷雕。
說人話:就是swap中的a椒丧,b只是main函數(shù)中a,b的復(fù)制品救巷!當(dāng)swap調(diào)用a壶熏,b時,是將main函數(shù)中的a浦译,b的值復(fù)制進(jìn)自己函數(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就是實(shí)參
NSLog(@"swap后---%d,%d",p.a,p.b);
}
return 0;
}
運(yùn)行打犹厩巍:
swap---2,1
swap后---2,1
哎哎哎妻枕,不是值復(fù)制嗎?為什么swap后p的值也變了呢她肯?佳头??
這里就牽涉到一個概念:指針對象晴氨!p是什么康嘉?是Person類的實(shí)例化變量,它在main函數(shù)中儲存的是一個指針地址籽前,這個地址指向的是Person對象亭珍!而當(dāng)p作為實(shí)參傳給swap時,依然是值復(fù)制枝哄,只不過復(fù)制的是p的指針地址肄梨!意味著swap中的形參p也是一個指向Person的地址而已,所以再swap操作p挠锥,就是直接操作Person本身V谙邸!1妥狻粱侣!
但是羊壹!但是!但是齐婴!swap中的p與main函數(shù)中的p是兩個變量油猫!不信的話你可以在swap中NSLog后添加一個p = nil;看看mian函數(shù)中調(diào)用swap后p會不會變空柠偶。