iOS

iOS下 ARC的内存管理

2018-08-07  本文已影响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的时候就没有持有和被持有的关系 出了对象的作用域 也就释放了

上一篇 下一篇

猜你喜欢

热点阅读