1、@autoreleasepool用法,为了让一些耗内存的操作提前释放,比如SDImage中的从磁盘读取图片就是写在autoreleasepool中
@autoreleasepool {
UIImage *diskImage = [self diskImageForKey:key];
if (diskImage && self.shouldCacheImagesInMemory) {
NSUInteger cost = SDCacheCostForImage(diskImage);
[self.memCache setObject:diskImage forKey:key cost:cost];
}
dispatch_async(dispatch_get_main_queue(), ^{
doneBlock(diskImage, SDImageCacheTypeDisk);
});
}
而对于下列这种情况
- (void)playWithDog{
Dog *dog = nil;
@autoreleasepool{
dog = [Dog new];
}
NSLog(@"111111111");
}
- (instancetype)init{
if (self=[super init]) {
NSLog(@"小狗被派出去啦!初始引用计数为");
}
return self;
}
- (void)dealloc
{
NSLog(@"小狗回到了宠物中心");
}
打印如下
2018-03-16 14:11:19.913446+0800 Pointer[48738:493873] 小狗被派出去啦!初始引用计数为
2018-03-16 14:11:21.740969+0800 Pointer[48738:493873] 111111111
2018-03-16 14:11:22.808060+0800 Pointer[48738:493873] 小狗回到了宠物中心
则是new的时候,执行init,playWithDog方法结束的时候执行Dog的dealloc方法。
接着说到dealloc中的意义。 非arc中的意义
释放自身的实例变量,
移除观察者,
停止timer,
移除通知,
代理置空等。
注意MRC 下dealoc 方法一定要在最后写
[super dealloc];
而arc中
系统会帮助我们释放该对象所包含的实例变量,但是有些对象还是需要们自己去释放的(比如Core Foundation框架下的一些对象),另外通知中观察者的移除,代理置空,停止timer等
示例如下所示:
一定不能有 [super dealloc];(我认为是系统已经帮我们执行了[super dealloc])
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];//移除通知观察者
[[XMPPManager sharedManager] removeFromDelegateQueue:self];//移除委托引用
[[MyClass shareInstance] doSomething ]//其他操作
scrollView.delegate = nil;
[timer invalidate];
}
网友评论