内存问题

可重复的内存增长才是真正的问题

内存问题_第1张图片
Snip20180423_1.png

应该避免内存的过高增长

内存问题_第2张图片
Snip20180423_2.png

ARC存在的内存问题

  • 不再被引用的循环引用(Unreferenced retain cycles)
  • 引用,但是不再使用的对象(Abandoned objects)
  • Objective-C 和 Core Foundation 对象相互转换的内存管理
    https://blog.csdn.net/yiyaaixuexi/article/details/8553659

block问题

block默认强应用内部的对象,因此以下情况会造成循环引用


内存问题_第3张图片
Snip20180423_3.png

__weak

  • __weak引用使用过程中可能为空


    内存问题_第4张图片
    Snip20180423_4.png
  • 避免过度使用__weak,__weak的使用是需要消耗资源的

__autoreleasing

  • 输出参数默认是__autoreleasing的,如NSError **(等价于NSError * __autoreleasing *)
  • 如果@autoreleasepool中包含__autoreleasing参数,会导致奔溃


    内存问题_第5张图片
    Snip20180423_5.png

    正确的实现方法为:

- (BOOL)startWithConfigurationURL:(NSURL*)url error:(NSError**)outError {
    NSError *localError = nil;
    BOOL wasSuccessful = YES;
    @autoreleasepool {
        // < get response from url >
        NSDictionary *parsed = [NSJSONSerialization JSONObjectWithData:response
        if (parsed) {
            // < use dictionary >
        } else {
            wasSuccessful = NO;
} }
    if (!wasSuccessful && outError) *outError = localError;
    return wasSuccessful;
}


你可能感兴趣的:(内存问题)