Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2697199
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: iOS平台

2015-08-04 15:47:35

http://my.oschina.net/are1ofblog/blog/394342?p=1

IOS学习—强引用(__strong)和 弱引用(__weak)

在Objective-C的ARC模式中,

?
1
id obj1 = [[NSObject alloc] init];
这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即:
?
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出来的对象会被立即释放。
 */
阅读(661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~