美文网首页iOS
iOS下 ARC的内存管理

iOS下 ARC的内存管理

作者: 无敌大闸蟹 | 来源:发表于2018-08-07 15:13 被阅读73次

1:自己生成的对象 自己持有 像alloc init 、new、copy、mutablecopy这些操作 持有这个对象
比如

UILabel *label = [[UILabel alloc] init];

就是 * label指针指向 UILabel的实例对象 也就是* label生成并且持有了 [[UILabel alloc] init]
并且适用于自定义的instancetype方法
比如

- (instancetype)initWithFrame:(CGRect)frame AndTitle:(NSString *)title
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

UILabel *label = [[UILabel alloc] initWithFrame:frame AndTitle:@"123"];

2: 不是自己生成的对象自己也能持有

举个例子

id obj = [NSMutableArray array];//非自己生成并持有的对象
[obj retain];//持有新生成的对象

3 不再需要自己持有的对象时释放对象

比如创建一个对象 做了一些操作 然后就不需要这个对象再做什么了

id obj = [[NSObject alloc] init];//持有新生成的对象
[obj doSomething];//使用该对象做一些事情
[obj release];//事情做完了,释放该对象  这里是手动释放下  在ARC模式下  不需要程序员做这一步操作 系统会自动帮我们做好

这里还要注意下 调用对象的release方法会销毁对象吗? 答案是不会:调用对象的release方法只是将对象的引用计数器-1,当对象的引用计数器为0的时候会调用了对象的dealloc 方法才能进行释放对象的内存。这个以前面试的时候有一道面试题是这个

4 无法释放非自己持有的对象 就是不属于你的东西你不能去乱动 比如

id obj = [[NSObject alloc] init];//持有新生成的对象
[obj doSomething];//使用该对象
[obj release];//释放该对象,不再持有了
[obj release];//释放已经废弃了的对象,崩溃

这里obj已经和[[NSObject alloc] init]没有持有和被持有的关系了

//================
然后说下计数器的概念
我们点到NSObject的文件里去看 是能看到计数器的标识的

#include <objc/objc.h>
#include <objc/NSObjCRuntime.h>

@class NSString, NSMethodSignature, NSInvocation;

@protocol NSObject

- (BOOL)isEqual:(id)object;
@property (readonly) NSUInteger hash;

@property (readonly) Class superclass;
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'type(of: anObject)' instead");
- (instancetype)self;

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

@end

可以看到 有一个- (NSUInteger)retainCount 来代表着当前对象的引用计数

并且在ARC模式下 不能使用retain/release/retainCount/autorelease

像alloc init 、new、copy、mutablecopy这些操作会使引用计算器加1

retain(非ARC)会加1

release(系统自动处理)会减1

当计数器为0的时候就没有持有和被持有的关系 出了对象的作用域 也就释放了

相关文章

  • iOS夯实:ARC时代的内存管理

    iOS夯实:ARC时代的内存管理 iOS夯实:ARC时代的内存管理

  • OC中内存管理

    在OC中内存管理MRC手动内存管理和ARC自动内存管理,ARC是从iOS 4.0开始,在iOS 4.0之前...

  • iOS内存管理详解

    iOS内存管理 前言: 现在的iOS开发已然是ARC时代,swfit的发展趋势也不错,ARC下的日常开发,随对内存...

  • 内存管理

    ARC内存管理机制详解理解 iOS 的内存管理

  • iOS - ARC环境下dealloc/didReceiveMe

    block没那么难(三):block和对象的内存管理 一、iOS开发 ARC下dealloc的使用 ARC下,系统...

  • 内存管理面试题

    讲一下 iOS 内存管理的理解 讲一下 iOS 内存管理的理解实现原理 内存中的5大区分别是什么? ARC 的 r...

  • ios循环引用

    首先,研究ios循环引用,离不开怎么使用strong和weak类型的引用和mrc下内存管理和arc下的内存管理。a...

  • Swift中如何避免循环引用

    内存管理中经常会遇到的一个问题便是循环引用。首先,我们来了解一下iOS是如何进行内存管理的。 ARC ARC(Au...

  • 内存管理

    OC知识--彻底理解内存管理(MRC、ARC) IOS工程中混合使用ARC与MRC iOS 简单而粗暴的说一说内存...

  • 《iOS开发进阶》阅读笔记(一)内存管理释疑

    ARC ARC能够解决iOS开发中90%的内存管理问题,但是另外还有10%的内存管理是需要手动管理的,主要就是与底...

网友评论

    本文标题:iOS下 ARC的内存管理

    本文链接:https://www.haomeiwen.com/subject/aazovftx.html