ARC机制之__strong具体解释

ARC机制之__strong具体解释

__strong  解析:

默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用。这意味着,仅仅要引用存在,对象就不能被销毁。这是一种所期望的行为:当全部(强)引用都去除时,对象才干被收集和释放。

只是, 有时我们却希望禁用这样的行为:一些集合类不应该添加其元素的引用。由于这会引起对象无法释放。在这样的情况下,我们须要使用弱引用(不用操心,内置的集合类就是这么干的),使用 __weak
keyword。NSHashTable就是一个样例。

当被引用的对象消失时,弱引用会自己主动设置为 nil。Cocoa的 Notification Center
就是这么一个样例,尽管这已经超出纯 Objective-C的语言范畴

自己更深理解:

1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;

在OC中strong就相当于retain属性,而weak相当于assign。仅仅有一种情况你须要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类}。子类中又调用了父类{子类又retain了父类},这样都无法release)

2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,假设这个时候还有weak指针指向该对象,则会清除掉全部剩余的weak指针

以下是笔者看书时遇到的疑问

(1) : __strong在ARC关闭时是否可用

(2): __strong修饰的变量,直接赋值时,赋值的变量的retain是否会自增(被赋值的变量retain是否会自减)

(3): __strong修饰的变量在超出其作用域时retain是否会自减

解答例如以下:

(1): 能

(2): 比如:

int count  =
1;

id __strong obj1 =nil;

id
__strong obj = [[NSObjectalloc]
init];

obj1 = obj;//obj1
持有obj 赋值对象的强引用
会导致obj retain自增

NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

NSLog(@"obj = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

打印例如以下:

2015-07-22 17:23:22.169字典[724:25567] Retain count is 2

2015-07-22 17:23:22.171字典[724:25567] obj = 2

说明:(1) :当一个对象获得还有一个对象的强引用时,retain++;

(2): 被赋值的变量retain是会自减

(3):

int count  =1;

id
__strong obj1 =nil;

if(count){

id
__strong obj = [[NSObjectalloc]
init];

obj1 = obj;//obj1
持有obj 赋值对象的强引用
会导致obj retain自增

NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));

}

NSLog(@"Retain count is %ld",CFGetRetainCount((__bridgeCFTypeRef)obj1));

__strong修饰的变量在超出其作用域时retain是会自减

时间: 2024-11-05 12:16:46

ARC机制之__strong具体解释的相关文章

ARC机制之__strong详解

ARC机制之__strong详解 __strong  解析: 默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用.这意味着,只要引用存在,对象就不能被销毁.这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放. 不过, 有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放.在这种情况下,我们需要使用弱引用(不用担心,内置的集合类 就是这么干的),使用 __weak 关键字.NSHashTable 就是一个例子.当被引用的对象

iOS ARC机制

iOS提供了ARC功能,很大程度上简化了内存管理的代码. 1.ARC的本质: 采用ARC后,iOS开发者完全可以抛弃之前繁琐的内存管理机制.在开启ARC的情况下,编译器会自动的在程序的正确位置隐式的插入retain,release和autorelease等.特别明确,ARC只是objective-C编译器的特征,所有ARC相关处理都会发生在构建应用程序的时候,这和内存垃圾回收机制不同. 2.基本的ARC使用规则 1)代码中不能使用retain,release,autorelease等: 2)不能

黑马程序员-内存管理之autorelease和ARC机制

一.autorelease 之前我们都是手动release对象,但是有时候我们需要延迟release对象,这里我们就需要用到autorelease,系统会把当前对象放在当前的autorelease pool中,当autorelease pool销毁时,会把当前池子中的所有对象做一次release操作.对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这些池子都是以栈结构的形式存在,在每一个Runloop结束时,当前栈顶的池子会被销毁,所有对象做一次release操作

iOS的ARC机制

C.OC语言没有自动内存管理机制,它需要程序员手动释放内存. [a release];//找到a指向的内存地址,并告诉a释放这块内存.a存在于栈中,a指向的地址在堆中. ARC并不是自动内存管理,它只不过是在运行时替你做了[a release]的这个操作,不用程序员手动写了. 自动内存管理机制就是不定期检查堆中的对象有没有被指向,ARC并不是. iOS的ARC机制

ARC机制集合内存管理

// //  main.m //  13-ARC机制集合内存管理 // //  Created by apple on 14-3-21. //  Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" //ARC机制,是否需要担心内存溢出呢 //谁告诉你不用的心得啊:道理就是下面的示 int main(int argc, c

设置部分文件不适用ARC机制

一般都是开启arc功能,毕竟不需要自己手动去释放,是一件比较轻松的事情. 但是我们在引用第三方的时候,基本上都是带release与retain的方法,这个时候代码编译就通不过 可以设置部分文件不使用arc,这样就可以兼容了. 步骤: 加入第三方库时候选择 1. 单击项目,在builde phases 中,compile sources     2.选中文件,双击文件,在弹出框中输入-fno-objc-arc, 3.编译就可以通过了.   注: 虽然使用ARC的好处多多,但在选择之前也需要考虑清楚

深入理解Objective C的ARC机制

前言 本文的ARC特指Objective C的ARC,并不会讲解其他语言.另外,本文涉及到的原理部分较多,适合有一定经验的开发者. 什么是ARC? ARC的全称Auto Reference Counting. 也就是自动引用计数.那么,为什么要有ARC呢? 我们从C语言开始.使用C语言编程的时候,如果要在堆上分配一块内存,代码如下 //分配内存(malloc/calloc均可) int * array = calloc(10, sizeof (int)); //释放内存 free(array);

IOS ARC 机制

iOS ARC 内存自动管理机制,目前,几乎好多的项目都会用ARC去,因为,它把内存释放这个体力活给干了,不过,虽然ARC很好,我们仍然不能完全把内存管理这回事儿抛在脑后. ARC的工作原理: ARC是一个编译前的步骤,它为我们的代码自动加上retain/release/autorelease语句. ARC并不是垃圾收集,而且,引用计数也没有消失,只是变成自动而已.听起来像是事后追加的这么一个功能,不过,只要我们想一想Objective-C有多少功能是通过对源文件的预处理来实现的,就不会这么想了

黑马程序员---OC之ARC机制

iOS /* ARC的判断准则:只要没有强指针指向对象,就会释放对象:反之就不会 指针分2种: 1> 强指针:默认情况下,所有的指针都是强指针  __strong 2> 弱指针:  __weak   当弱指针所指的对象被销毁后,该弱指针会自动被清空,变为空指针 没有意义的写法,因为这样写,Person对象p刚创建就会被销毁 __weak Person *p = [[Person alloc] init];    // 这行代码后,编译器会自动加上 p = nil; ARC特点: 1> 不