首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C 内存管理之 _ARC

_strong 属性基本上能适应 ARC 环境下的全部情况.假设不写的话,默觉得_ strong 属性. (2) __weak 不持有对象,仅仅是简单地引用而已....(id)autorelease;// 是 NSObject提供的方法,此方法在某一个预定的时候,想对象发送 release 消息,返回值是接收消息的对象.实际上当给一个对象发送 autorelease...消息的时候,就是将这个对象加入到自己主动释放池( NSAutoreleasePool) 中,当自己主动释放池被销毁时,会向该池中的全部对象发送 release 消息 暂时对象和拥有对象 当使用如:arrayWithCapacity...你不必考虑内存释放问题。 [NSColor blueColor]; 单例对象,永远不会被销毁,可是你也不必考虑它的内存问题。...不能在 C 结构中使用对象指针,假设有相似功能,能够创建一个 Objective-C 类来管理这些对象 在 id和 void * 之间没有简便的转换方法,相同在Objective-C 和 Core Foundation

57910

2020-iOS最新面试题解析—1(原理篇)

为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。...无论在MRC下还是ARC下均不需要 被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的 object_dispose()方法中释放 补充:对象的内存销毁时间表...:不手动指定autoreleasepool,Autorelease对象会在当前的 runloop 迭代结束时释放,下面详细说明释放时机 RunLoop中的三个状态会处理自动释放池,通过打印代码发现有两个...什么是method swizzling(俗称黑魔法) 简单说就是进行方法交换 在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。...nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。

1.7K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS工程师必看的 20 道 面试题

    请说明并比较以下关键词:strong, weak, assign, copy strong表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。...当然强行将其设为nil可以销毁它。 weak表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。...weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。...当对象被声明为 weak 时,父层级对此对象没有指向,该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到 nil,不亏崩溃 unowned 与弱引用本质上一样。...唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。如果继续访问该对象,程序就会崩溃。

    3.8K40

    iOS - 老生常谈内存管理(二):从 MRC 说起

    简介 关于内存管理   应用程序内存管理是在程序运行时分配内存,使用它并在使用完后释放它的过程。编写良好的程序将使用尽可能少的内存。...原因是这些方法内部是给对象调用了autorelease方法,所以这些对象会被加入到自动释放池中。   ...(在Objective-C中允许给nil发送消息,且这样会直接返回不做任何事情。所以就算是第一次调用,_count 变量为nil,对其进行 release也没事。...你要确保在集合中它们不会被销毁,所以你在它们添加进集合时给它们发送一个retain消息。如果删除了它们,则必须给它们发送一个release消息。...对象在块内每接收一次autorelease消息,就会被发送一条release消息。 与任何其他代码块一样,@autoreleasepool可以嵌套,但是你通常不会这样做。

    1.6K21

    iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    系统根据引用计数器的机制来判断对象是否需要被回收。在每次 RunLoop 迭代结束后,都会检查对象的引用计数器,如果引用计数器等于 0,则说明该对象没有地方继续使用它了,可以将其释放掉。...对象即将被销毁时系统会自动给对象发送一条 dealloc 消息(因此,从 dealloc 方法有没有被调用,就可以判断出对象是否被销毁) dealloc 方法的重写(注意是在 MRC 中) 一般会重写...[p release]; // 报错 } return 0; } 为了避免给野指针发送消息会报错,一般情况下,当一个对象被释放后我们会将这个对象的指针设置为空指针。...autorelease 是一种支持引用计数的内存管理方式,只要给对象发送一条 autorelease 消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的「所有对象」做一次 release...注意:这里只是发送 release 消息,如果当时的引用计数(reference-counted)依然不为 0,则该对象依然不会被释放。

    1.4K20

    iOS内存管理(二)-深入解析自动释放池

    AutoreleasePool释放时机 一个是在runloop中隐式创建的autoreleasepool,每个接受autorelease消息的对象,都会在runloop结束时释放。...RunLoop检测到事件后,就会创建自动释放池; 所有的延迟释放对象都会被添加到这个池子中; 在一次完整的运行循环结束之前,会向池中所有对象发送 release消息,然后自动释放池被销毁; 理解主线程上的自动释放过程...当销毁自动释放池时,会从从自动释放池的中的最后一个入栈的autorelease对象开始,依次给它们发送一条release消息,直到遇到这个POOL_BOUNDARY page->full() begin...新的自动释放池被创建的时候,它们会被添加到栈的顶部,而当池子销毁的时候,会从栈移除。对于当前线程来说,Autoreleased对象会被放到栈顶的自动释放池中。...在块的末尾,这些临时对象会被释放掉,内存占用通常也会因此而降下来。

    1.3K10

    iOS 内存管理相关面试题

    指向对象的强指针是否被销毁 引用计数器 给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身) 给对象发送一条release消息,可以使引用计数器-1(注意release并不代表销毁...答:多次将地址存到自动释放池中,导致野指针异常 2.6 自动释放池作用 将对象与自动释放池建立关系,池子内调用 autorelease 方法,在自动释放池销毁时销毁对象,延迟 release 销毁时间...程序运行结束之前销毁 事件处理结束以后,会销毁自动释放池 还有在池子满的时候,也会销毁 2.9 自动释放池使用注意: 不要把大量循环操作放在释放池下,因为这会导致大量循环内的对象没有被回收,这种情况下应该手动写...加载进去图片之后,占用的内存归系统管理,我们无法管理 使用 imageWithContentsOfFile: 加载图片 加载到内存当中后,占据内存空间较小 相同的图片会被重复加载内存当中 对象销毁的时候...对象 不能在c结构体中使用对象指针,如果有类似功能可以创建一个Objective-c类来管理这些对象 在id和void *之间没有简便的转换方法,同样在Objective-c和core Foundation

    1.6K30

    iOS_理解“属性”(property)这一概念

    (ARC模式后才新增的修饰符) 4)weak:“非拥有关系”(nonowning relationship) ​ 弱引用,同assign类似,但是在当前属性指向的对象被释放时,该属性会被置空(=nil)...当一个对象还有strong类型的指针指向时,不会被释放。若仅有weak类型的指针指向时,会被释放。 系统是如何实现weak变量的? ​...但是block创建的时候时分配在栈上,作用域属于创建时的作用域,因为栈区的特点就是创建的对象在出了作用域后随时可能被销毁,一旦销毁,后续再使用就会crash。...__strong:强引用,保证在block执行完之前,对象不会被释放。...(当我们不再引用这个控件时,它才会被销毁) 参考:《Effective Objective-C 2.0》

    61720

    iPhoneMac Objective-C内存管理教程和原理剖析(一)基本原理

    ClassA *obj1 = [[ClassA alloc] init]; 2 Objective-C的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。...例如,某个对象被两个指针所指向(引用)那么它的retain count为2。需要销毁对象的时候,不直接调用dealloc,而是调用release。...注意,如果没有调用[obj2 release],这个对象的retain count始终为1,不会被销毁,内存泄露。...5 Objective-C中引入了autorelease pool(自动释放对象池),在遵守一些规则的情况下,可以自动释放对象。...7 Objective-C程序中可以嵌套创建多个autorelease pool。在需要大量创建局部变量的时候,可以创建内嵌的autorelease pool来及时释放内存。

    30910

    iOS面试题梳理(一)

    2.动态绑定:基于动态类型,在某个实例对象被确定后,其类型便被确定了,该对象对应的属性和响应消息也被完全确定。...消息,当对象引用计数为0时,系统将释放该对象,这是OC的手动管理机制(MRC)。...2.向一个对象发送一条autorelease消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象。...3.向一个对象发送release消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为0时,系统才会调用dealloc方法,释放该对象和对象本身它所拥有的实例。...其他注意事项 1.如果一个对象有一个_strong类型的指针指向着,找个对象就不会被释放。如果一个指针指向超出了它的作用域,就会被指向nil。

    1.1K60

    iOS的内存管理

    在没有引用计数的情况下,一般内存管理的原则是 “谁申请谁释放”,那么对象 A 就需要在对象 B 不再需要对象 M 的时候,将对象 M 销毁。...我们另外还有一种办法,就是对象 A 在构造完对象 M 之后,始终不销毁对象 M,由对象 B 来完成对象 M 的销毁工作。...如果对象 B 需要长时间使用对象 M,它就不销毁它,如果只是临时用一下,则可以用完后马上销毁。...不要向已经释放的对象发送消息 有些同学想测试当对象释放时,其 retainCount 是否变成了 0,他们的试验代码如下: - (BOOL)application:(UIApplication *)application...这是因为当最后一次执行 release 时,系统知道马上就要回收内存了,就没有必要再将 retainCount 减 1 了,因为不管减不减 1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域,

    98780

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。...在b非nil时,a和b指向同一个内存地址,在b变nil时,a变nil。此时向a发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。...在 Objective-C 中向 nil 发送消息是完全有效的——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。...我们可以看到,在[array release];之后,overview就会被release释放掉了。 既然会被销毁,那么具体在什么时间点?...objc使用什么机制管理对象内存? ARC通过什么方式帮助开发者管理内存? 不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?

    1K100

    OC知识--彻底理解内存管理(MRC、ARC)

    方法 当一个对象的引用计数器值为0时,这个对象即将被销毁,其占用的内存被系统回收 对象即将被销毁时系统会自动给对象发送一条dealloc消息(因此,从dealloc方法有没有被调用,就可以判断出对象是否被销毁...,一般情况下,当一个对象被释放后我们会将这个对象的指针设置为空指针 空指针 没有指向存储空间的指针(里面存的是nil, 也就是0) 给空指针发消息是没有任何反应的 int main(int argc,...autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作...注意,这里只是发送release消息,如果当时的引用计数(reference-counted)依然不为0,则该对象依然不会被释放。...方法,所以对象没有加入到自动释放池 Person *p = [[Person alloc] init]; [p run]; } 在自动释放池的外部发送autorelease 不会被加入到自动释放池中

    4.5K80

    iOS面试题梳理(二)

    对象A的销毁依赖于对象B的销毁,同时对象B销毁也依赖与对象A的销毁,从而形成循环引用,此时,即使外界没有任何指针访问它,它也无法释放。...在 Objective-C 中如何实现 KVO 1.注册观察者(注意:观察者和被观察者不会被保留也不会被释放) - (void)addObserver:(NSObject *)observer forKeyPath...当我们调用一个静态方法时,需要对对象进行 release 吗不需要,静态方法(类方法)创建一个对象时,对象已被放入自动释放池。在自动释放池被释放时,很有可能被销毁。...提供的是对象-关系映射功能,也就是说,CoreData可以将Objective-C对象转换成数据,保存到SQL中,然后将保存后的数据还原成OC对象。...1.自动释放池是NSAutorelease类的一个实例,当向一个对象发送autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象。

    1.2K101

    iOS runtime探究(五): 从runtime开始深入weak实现机理你要知道的runtime都在这里

    weak weak不论是用作property修饰符还是用来修饰一个变量的声明其作用是一样的,就是不增加新对象的引用计数,被释放时也不会减少新对象的引用计数,同时在新对象被销毁时,weak修饰的属性或变量均会被设置为...nil,这样可以防止野指针错误,本文要讲解的也正是这个特性,runtime如何将weak修饰的变量的对象在销毁时自动置为nil。...那么runtime是如何实现在weak修饰的变量的对象在被销毁时自动置为nil的呢?一个普遍的解释是:runtime对注册的类会进行布局,对于weak修饰的对象会放入一个hash表中。...了解了以上知识后就可以深入runtiem代码来看看具体实现细节,有兴趣的读者可以继续阅读。...深入runtime理解weak 这部分内容参考《Objective-C高级编程:iOS与OS X多线程和内存管理》,可以看出具体的实现方式就是使用了一个HashTable。

    1.2K60

    iOS内存管理-基本概念整理

    二、内存管理/引用计数 无论是MRC还是ARC环境,Objective-C都采用引用计数来管理内存;每个对象都有一个引用计数器,任何时候指向对象的指针个数和对象的引用计数相等,当一个对象的引用计数为0的时候将会被释放...4.非自己持有的对象无法释放 在应用程序中释放非自己持有的对象就会造成崩溃,使用代码演示如下: //情况1:释放完不再需要的对象后再次释放,访问了已经废弃的对象而崩溃!...__weak与__strong修饰符的作用相反,表示弱引用,不会增加引用计数; 2.当对象被释放后,所有指向它的弱引用都会被置为nil,这样避免了野指针问题。 3....但是为了在ARC也能实现对Core Foundation对象的自动内存管理,我们就必须将其与Objective-C对象的转换。...delegate循环引用 NSTimer循环引用 创建的非OC对象内存,在使用完毕后未手动释放; 循环操作创建大量临时对象,导致内存导致内存暴涨; 地图类处理,使用完毕后未及时销毁地图相关组件对象 六

    1.1K31

    iOS 开发:彻底理解 iOS 内存管理(ARC 篇)

    使用 ARC 后,系统会检测出何时需要保持对象,何时需要自动释放对象,何时需要释放对象,编译器会管理好对象的内存,会在何时的地方插入 retain、release 和 autorelease,通过生成正确的代码去自动释放或者保持对象...如果两个以上的成员变量互相强引用对方,则两个对象将永远不会被释放,从而发生内存泄漏。所谓内存泄露就是当废弃的对象在超出其生存周期后继续存在。...因为带 __weak 修饰符的变量不持有对象,所以在超出其变量作用域时,对象就会被释放。...具体用法如下: int main(int argc, const char * argv[]) { // 不用写 release, main 函数执行完毕后 p 会被自动释放 Person...直到 main 函数执行完毕,Person 类生成的对象超出了作用范围的空间,此时 p 也不再持有该对象,该对象也即将被销毁,内存得到释放。 4.

    61310

    iOS中的各种理论知识

    Objective-C 部分 1. 你如何理解OC 的内存管理 OC 内存管理是基于引用计数。...谁想使用某个对象B,就要把对象B 的计数器+1,如果不 使用这个对象了,那么就把对象B 计数器-1,如果B 对象计数器减到0,那么B 对象自动会调用自己的 dealloc函数,也就是这个对象被销毁。...一句话就是谁拥有对象,谁负责释放该对象,谁alloc 谁应该release 或者autorelease 系统有一个自动释放池,对于一些对象我们可以放在自动释放池中。...如果自动释放池本身销毁,那么里面的内容会被全部调用release....name= “yang”的关系 self.name 表示调用setter 调用一个函数 name=”year”表示给字段field 赋值 什么是深拷贝和浅拷贝copy 浅拷贝只是拷贝对象本身,不递归的拷贝里面的子对象深拷贝是把对象以及对象的对象递归拷贝

    36510

    iOS - 老生常谈内存管理:导读

    MRC 下什么时候需要给对象发送 release 消息?什么时候使用 autorelease? 为什么不要在初始化方法和 dealloc 中使用访问器方法?...weak 变量在对象被销毁后是如何置为 nil 的,Runtime 是怎样实现它的? Runtime 为 weak 变量赋值的过程?...释放 NSAutoreleasePool 对象,使用 [pool release] 与 [pool drain] 的区别? @autoreleasepool 你了解多少?...ARC 环境下,方法里的局部对象什么时候释放? ARC 环境下,autorelease 对象在什么时候释放? ARC 环境下,需不需要手动添加 @autoreleasepool?...阅读注意 为避免语义混淆,所有文章中的 “释放” 一词均指release,“销毁” 一词均指dealloc。 如果您在阅读中发现任何错误,欢迎指出。 总结不易,点个关注吧!

    63710

    iOS 面试策略之语言工具-Objective-C

    ,这个时候我们就可以将对象销毁,回收内存。...类似问题: Objective-C 的内存管理机制是什么? 2.什么情况下会出现循环引用? 关键词:#内存管理 循环引用是指 2 个或以上对象互相强引用,导致所有对象无法释放的现象。...其修饰的对象引用计数会增加 1。该对象只要引用计数不为 0 则不会被销毁。当然强行将其设为 nil 可以销毁它。 weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。...weak 一般用来修饰对象,assign 一般用来修饰基本数据类型。原因是 assign 修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。...关键词:#线程 #runloop runloop 是每一个线程一直运行的一个对象,它主要用来负责响应需要处理的各种事件和消息。

    68420
    领券