IOS学习—强引用(__strong)和 弱引用(__weak)
2016-05-27 09:18
483 查看
转载于开源中国
在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。
下面用代码来说明:
在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出来的对象会被立即释放。 */
相关文章推荐
- 【代码笔记】iOS-手机验证码
- 【代码笔记】iOS-手机验证码
- 带你深入理解IOS Block
- iOS的主要框架介绍
- 关于iOS9之后的loadViewIfNeeded
- ios 导航栏透明
- IOS学习之蓝牙4.0
- iOS9新特性-应用内搜索CoreSpotlight
- MVVM奇葩说
- [一句秒懂]ios 清除缓存
- iOS中的黑科技(一些方法或者功能的实现)
- 如何给iOS 分类添加 属性
- iOS ERROR: unable to get the receiver data from DB
- IOS博客项目搭建-16-发微博-点击button获取相册图片
- ios runtime基础应用
- 【iOS技术】Xcode+GitHub远程代码托管(GIT, SVN)
- iOS开发--遇到的友盟的几个坑
- iOS 多控制器之间的跳转和数据存储
- iOS 图片剪切
- 解决iOS上传图片后,图片方向错误的问题