iOS-Objective-C

OC中方法隐藏参数self的传递

2017-09-25  本文已影响23人  追沐

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

上一篇 下一篇

猜你喜欢

热点阅读