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的时候就没有持有和被持有的关系 出了对象的作用域 也就释放了
网友评论