在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
//? study
//
//? Created by maao on 16/5/12.
//? Copyright ? 2016年 maao. All rights reserved.
#import<Foundation/Foundation.h>
int main(int argc, 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出来的对象会被立即释放。
*/