在OC代碼中,對象通過發送消息,執行一定的操作,[ ]是方法的發起形式。每個方法都會有一個默認的隱藏參數,這里來看看這個默認參數。寫此篇總結的主要目的是對OC方法調用隱藏參數進行一下了解和認識。
OC方法傳參
調用一個方法,傳遞一個參數,比如:
- (void)shoppingWithFriend:(Person *)friend;//和某個朋友一起購物,在實現文件的init方法和shopping方法中都打印了self的地址。
該方法傳遞了一個參數friend,這個參數是Person類型的。和C里面一樣,friend是一個形式參數。
OC默認參數傳遞
在調用一個OC方法的時候,有一個默認的參數會被傳遞,舉個例子來看:
定義一個Person類
@interface Person : NSObject
- (void)shopping;
@end
#import "Person.h"
@implementation Person
- (instancetype)init {
if (self = [super init]) {
NSLog(@"init self :%p",self);
}
return self;
}
- (void)shopping {
NSLog(@"shopping self :%p",self);
}
@end
調用
Person *person1 = [[Person alloc] init];
NSLog(@"init 后 :%p",person1);
[person1 shopping];
打印結果:
2017-09-25 15:46:19.977 Class[11573:293345] init self :0x608000015c10
2017-09-25 15:46:19.978 Class[11573:293345] init 后 :0x608000015c10
2017-09-25 15:46:19.978 Class[11573:293345] shopping self :0x608000015c10
分析
打印結果地址是一樣的,為什么打印self會有值?是因為在執行alloc init方法和shopping方法的時候,self作為默認參數被傳遞到了方法體里面。在這里傳遞的默認參數其實就是“person1”。
其實就是相當于將方法寫成下面這樣:
- (instancetype)initWithPerson:(Person *)person;
- (void)shoppingWithPerson:(Person *)person;
只是這個默認參數不用我們傳遞,OC方法中默認傳遞的而已。所以能在方法中直接拿到self,打印結果也是同一個地址,都是person1的地址。