OC中方法隱藏參數self的傳遞

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • 20- 枚舉,枚舉原始值,枚舉相關值,switch提取枚舉關聯值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,313評論 1 6
  • 1.自定義控件 a.繼承某個控件 b.重寫initWithFrame方法可以設置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,469評論 2 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,880評論 1 10