iOS學習—強引用(__strong)和 弱引用(__weak)


在Objective-C的ARC模式中,

id obj1 = [[NSObject alloc] init];

這里雖然沒有顯示的聲明為__strong,但是Objective-C默認聲明的一個對象就為__strong,即:

id obj1 = [[NSObject alloc] init];

id __strong obj1 = [[NSObject alloc] init];

是等價的。

在強引用中,有時會出現循環引用的情況,這時就需要弱引用來幫忙(__weak)。

強引用持有對象,弱引用不持有對象。

強引用可以釋放對象,但弱引用不可以,因為弱引用不持有對象,當弱引用指向一個強引用所持有的對象時,當強引用將對象釋放掉后,弱引用會自動的被賦值為nil,即弱引用會自動的指向nil。

下面用代碼來說明:

//
//  main.m
//  ARC中的強引用和弱引用
//
//  Created by on 15/3/31.
//  Copyright (c) 2015年 apple. All rights reserved.
//
 
#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        id __weak obj0 = nil;
        if (YES) {
            id obj1 = [[NSObject alloc] init];
            obj0 = obj1;
            NSLog(@"obj0: %@", obj0);
        }
        NSLog(@"obj0: %@", obj0);
    }
    return 0;
}
 
/*
 *  輸出結果
 *  obj0: <NSObject: 0x1003066c0>
 *  obj0: (null)
 *
 *  因為obj1生成的默認的為強引用(__strong),在超出if的作用域之后,obj1所持有的對象被釋放,
 *  obj0為弱引用,所以obj0不持有對象,在obj1對象釋放后,obj0自動的被賦值為nil
 *  弱引用的特性是,不持有對象,即便是寫成id __weak obj1 = [[NSObject alloc] init];
 *  此代碼系統會給與警告,因為這里obj1被聲明成弱引用,那么在賦值之后,alloc出來的對象會被立即釋放。
 */
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容