在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的地址。