一个苹果OC底层相关

Effective Objective-C 2.0笔记(四)

2019-03-18  本文已影响0人  _小沫

第五章 内存管理

第29条:理解引用计数

[object release];
object = nil;
- (void)setFoo:(Foo *)foo {
  [foo retain];
  [_foo release];
  _foo = foo;
}

这个顺序极其重要,假如还未保留新值就释放旧值,两个对象又指向了同一个对象,那么先执行的release操作可能导致系统将此对象永久回收,后续的retain操作则无法令这个被彻底回收的对象复生;

第30条:以ARC简化引用计数

- (void)dealloc {
  CFRelease(_coreFoundationObject);
  free(_heapAllocaatedMemoryBlob);
}

第31条:在dealloc方法中只释放引用并解除监听

在dealloc方法中,应该做的是:释放指向其他对象的引用;移除KVO或NSNotificationCenter通知;

第32条:编写“异常安全代码”时留意内存管理问题

异常一般只应在严重错误后才抛出(第21条);
在@try块中,如果先保留了某个对象,然后在释放它之前又抛出异常,除非@catch块能处理该问题,否则就发生内存泄露了;

    Object *ojbect;
    @try {
        object = [[Object alloc] init];
        exception
        ....
    }
    @catch(NSExpression *expression) {
        ...
    }
    @finally {
        [object release];
    }

第33条:以弱引用避免保留环(循环引用)

第34条:以自动释放池降低内存峰值

非alloc,new,copy,mutableCopy词开头方法创建的对象,都是autorelease对象,如果没有手动创建自动释放池,那么autorelease对象要等到下个Runloop后才释放;如果在下个Runloop之前,autorelease对象已经很多(比如for循环创建对象),那么内存峰值将会很高;那么,可以在适当的时机,手动创建autorelease pool使得对象及时释放以降低内存:

      for (int i = 0; i < 100000; i ++) {
            @autoreleasepool {
                Object *obj = [Object ojbect];
            }
        }
上一篇下一篇

猜你喜欢

热点阅读