内存管理的思考方式2(arc下)

凌风4819 凌风4819     2022-10-04     567

关键词:

所有权修饰符

所有权修饰符共有四种

  • __strong
  • __weak
  • __unsafe_unretained
  • __sutoreleasing

__strong修饰符

是id类型和对象类型默认的所有权修饰符,通过__strong修饰符,不必再次键入retain或者release,完美的满足了‘引用计数式内存管理的思考方式’:

  • 自己生成的对象自己持有
  • 非自己生成的对象,自己也可以持有
  • 不再需要自己持有的对象时释放
  • 非自己持有的对象无法释放

前两项只需通过对带__strong修饰符的变量赋值即可达成。通过废弃带__strong修饰符的变量(变量作用域结束或是成员变量所属对象废弃)或者对变量赋值,

都可以做到第三项,最后一项“非自己持有的对象无法释放”,由于不必再次键入release,所以原本就不会执行。

__weak修饰符

__weak是为了解决循环引用问题而存在的,循环引用容易发生内存泄漏。所谓内存泄漏就是应当废弃的对象在超出其生存范围后继续存在。

__weak还有另一优点,在持有某对象的弱引用时,若该对象被废弃,则此弱引用讲自动失效并被置为nil的状态。

__unsafe_unretained修饰符

是不安全的所有权修饰符,尽管ARC式的内存管理是编译器的工作,但附有__unsafe_unretained修饰符的变量不属于编译器的内存管理对象。

__autoreleasing修饰符

 

在 ARC 中使用 Blocks 和以某种方式复制的奇怪内存泄漏

】在ARC中使用Blocks和以某种方式复制的奇怪内存泄漏【英文标题】:WeirdmemoryleakwithBlocksandcopyingincertainwayinARC【发布时间】:2013-04-2814:01:00【问题描述】:以下简单代码在ARC下,在最新的Xcode(4.6.2)中使用Leaks工具进行分析,在iOS模... 查看详情

arc内存管理中容易忽略的问题

目录:一、字符串(String) 1.1、字符串的创建 1.2、字符串的isa二、拷贝(copy) 2.1、immutable对象的copy 2.2、mutable对象的copy 2.3、浅拷贝与深拷贝2.4、单层深拷贝三、集合(Collections) 3.1、NSMapTable 3.2、NSHashTable 3.3、NSP... 查看详情

arc下面的block对内存的管理方式(代码片段)

一、问题引入  近日开发中引入一个随机crash,Crash堆栈如下:  ExceptionType:SIGSEGVExceptionCodes:SEGV_ACCERRat0x0000000101850148CrashedThread:0Thread0Crashed:0libobjc.A.dylib0x00000001802601a0objc_retain+161CoreFoundation0x0 查看详情

ios开发arc与非arc代码的区别

...么原因啊,所以代码贴出来问下大家!是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(Mann... 查看详情

“内存是自动管理的” - 如何?

】“内存是自动管理的”-如何?【英文标题】:"Memoryismanagedautomatically"-how?【发布时间】:2014-06-0315:24:08【问题描述】:我知道GC和ARC最大的区别在于GC是运行时进程,而ARC是在编译时运行。因此,在使用ARC时,开发人员... 查看详情

带有块、ARC 和非 ARC 的 Objective C 内存管理

】带有块、ARC和非ARC的ObjectiveC内存管理【英文标题】:ObjectiveCmemorymanagementwithblocks,ARCandnon-ARC【发布时间】:2012-07-2711:37:09【问题描述】:我使用块已经有一段时间了,但我觉得在ARC和非ARC环境中的内存管理方面我有些怀念。我... 查看详情

ios内存管理理论知识过一遍(代码片段)

目录1】为什么要进行内存管理2】内存管理的方式3】自动引用计数技术(ARC) 一、为什么要进行内存管理 二、内存管理的方式1、引用计数这套方案应用广泛,在多种语言中使用引用计数(ReferenceCount)是一个简单而有效... 查看详情

oc56--arc多个对象的内存管理

//main.m//ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码;////ARC单个对象的内存管理:不使用的时候就置为nil,... 查看详情

objective-c的内存管理mrc与arc

 Objective-c的内存管理MRC与ARC Objective-c中提供了两种内存管理机制MRC(MannulReferenceCounting)和ARC(AutomaticReferenceCounting),分别提供对内存的手动和自动管理,来满足不同的需求。注意的是Xcode4.1及其以前版本没有ARC,MRC与ARC的... 查看详情

系统声音的 ARC 内存管理问题

】系统声音的ARC内存管理问题【英文标题】:ARCmemorymanagementissuewithsystemsounds【发布时间】:2012-05-0616:12:36【问题描述】:我正在使用...播放系统声音NSString*path=[NSStringstringWithFormat:@"%@%@",[[NSBundlemainBundle]resourcePath],@"/heartbeat.wav"];//... 查看详情

ios开发arc内存管理技术要点

ARC的本质ARC的开启与关闭ARC的修饰符ARC与BlockARC与Toll-FreeBridgingARC的本质ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。AutomaticReferenceCounting(ARC)isacompiler-levelfeaturethatsimplifiestheprocessofmanagingobjectlifetimes(me 查看详情

arc下的内存管理

1.ARC下单对象内存管理局部变量释放对象随之被释放intmain(intargc,constchar*argv[]){@autoreleasepool{Person*p=[[Personalloc]init];}//执行到这一行局部变量p释放//由于没有强指针指向对象,所以对象也释放return0;}清空指针对象随之被释放intmain(intar... 查看详情

MPMoviePlayerController 不播放任何视频内容 [由于 ARC 和内存管理]

】MPMoviePlayerController不播放任何视频内容[由于ARC和内存管理]【英文标题】:MPMoviePlayerControllernotplayinganyvideocontent[duetoARCandmemorymanagement]【发布时间】:2012-07-0616:03:21【问题描述】:我正在尝试在iOS应用程序中播放视频,当用户按... 查看详情

ios面试题:啥是arc?(arc是为了解决啥问题诞生的?)

...么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。MRC下内存管理的缺点:1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)2.多线程操作时,不确定哪个... 查看详情

oc55--arc单个对象的内存管理

//Person.h#import<Foundation/Foundation.h>@interfacePerson:NSObject@end//Person.m#import"Person.h"@implementationPerson-(void)dealloc{NSLog(@"%s",__func__);//[superdealloc];//ARC不准写}@end////main 查看详情

objective-c启用arc时的内存管理(循环引用)

...l/cuibo1123/7443125      在Objective-C中,内存的引用计数一直是一个让人比较头疼的问题。尤其是当引用计数涉及到arc、blocks等等的时候。似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,... 查看详情

内存管理机制

Objective-C中提供了两种内存管理机制MRC(MannulReferenceCounting)和ARC(AutomaticReferenceCounting),分别提供对内存的手动和自动管理,来满足不同的需求. ARC: ARC是AutoReferenceCounting的缩写,即自动引用计数,由编译器在代码合适的... 查看详情

arc下处理内存暴涨的一个解决办法

有一种情况:for(inti=0;i<1000000000;i++){NSString*s=@"ABC";s=[slowercaseString];s=[sstringByAppendingString:@"ac"];NSLog(@"%@",s);} 运行,内存暴涨!!!!!! 这情况下,给循环体里面的操作加一个释放池即可for(inti=0;i<100000000 查看详情