在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出來的對象會被立即釋放。
*/