技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: iOS平台
2015-08-04 15:47:35
在Objective-C的ARC模式中,
1
|
id obj1 = [[NSObject alloc] init];
|
1
|
id obj1 = [[NSObject alloc] init];
|
1
|
id __strong obj1 = [[NSObject alloc] init];
|
是等价的。
在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。
强引用持有对象,弱引用不持有对象。
强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱引用会自动的指向nil。
下面用代码来说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//
// 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出来的对象会被立即释放。
*/
|