`
sofire
  • 浏览: 146138 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存管理MRR/ARC,property和内存泄露

 
阅读更多

MRR:Manual retain-release

推荐:《iPhone/Mac Objective-C内存管理教程和原理剖析》

http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680488.html

  • 生成的对象,有一个引用计数:retainCount,当retainCount = 0,内存就会被释放
  • 用alloc/new/copy生成对象时,其 retainCount = 1
  • retain 让retainCount + 1,release让retainCount - 1,成对出现:[obj retain]  [obj release]
  • 用autorelease能让retainCount的管理简单些,涉及到autorelease pool
  • 在生成新的RunLoop时,系统自动创建新的autorelease pool

property的修饰符:

  • assign
  • copy
  • retain:参考默认实现,很重要

  • 如:@property (retain) objA* obj;

retain、copy的默认实现:

-(void) setObjB:(ClassB*) value

{

         if (objB != value)

         {

                   [objB release]; //原来的对象会先release

                   objB = [value retain]; //copy类似

         }

}  

 

assign针对简单数据类型(scalar types) ,如int,float, CGRect, NSInteger等,它只是简单的赋值操作

 

 

 

copy/mutableCopy 浅拷贝和深拷贝

参考:《浅析ObjectiveC 深浅拷贝学习 》http://www.cocoachina.com/bbs/read.php?tid=80463

  • 不可改变对象的copy,才是浅拷贝;其他都是深拷贝
  • copy 返回的对象都是不可改变的
  • 容器类(如NSArray等) 的内容都是浅拷贝的

内存泄露

参考:《Presentation: Finding & Fixing Mem Leaks》

http://www.streamingcolour.com/blog/2010/09/21/presentation-finding-fixing-mem-leaks/

 

常见情况1:

// @property (nonatomic, retain) MyClass* objA;

 

- (void)foo{

  //retainCount = 2

  self.objA = [[MyClass alloc] init];

}

 

- (void)dealloc{

  //retainCount = 1

  [objA release];

  [super dealloc];

}

 

修复方法:

// @property (nonatomic, retain) MyClass* objA;

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

 

- (void)foo{

  //retainCount = 1

  MyClass *obj = [[MyClass alloc] init];

  //retainCount = 2

  self.objA = obj;

  //retainCount = 1

  [obj release]

}

 

- (void)dealloc{

  //retainCount = 0

  [objA release];

  [super dealloc];

}     

 

常见情况2:

 

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

       // @property (nonatomic, retain) MyClass* objA;

 

- (void)foo{

  MyClass *obj = [[MyClass alloc] init];

  self.objA = obj;

  [obj release];

  //retainCount = 1

}

 

- (void)dealloc{

  //retainCount = 1

  [super dealloc];

}

 

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

修复方法:

// @property (nonatomic, retain) MyClass* objA;

 

- (void)foo{

  MyClass *obj = [[MyClass alloc] init];

  self.objA = obj;

  [obj release];

  //retainCount = 1

}

 

- (void)dealloc{

  //retainCount = 0

  [objA release];

  [super dealloc];

}

 

self.abc = nil 与 _abc = nil的区别

@property (retain) classA *abc;

@synthesize abc = _abc;

 

需要明白 self.abc 的默认实现,它相当于:

[_abc release];

_abc = nil;

前者会发送release消息,而后者可能有内存泄露。

 

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

Tools

  • Build & Analyze
  • Leaks Instument  

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

Automatic Reference Counting

  • “Automatic Reference Counting (ARC) is a compiler-level feature that simplifies the process of managing object lifetimes (memory management) in Cocoa applications.”
  • ARC is a pre-compilation step that adds retain/release/autorelease statements to your code for you
  • 需要Xcode 4.2+, Apple LLVM 3.0+ compiler 
<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

简化了编程(本周上和MRR是一样的),不需要/不能使用下面这些方法

  • retain /release
  • autorelease
  • retainCount
  • NSAllocateObject / NSDeallocateObject  

property的修饰符:

  • strong:相当于retain
  • weak:相当于assign

变量修饰符:

  • __strong
    • This means any object created usingalloc/init is retained for the lifetime of its current scope.
    • is the default so you don’t need to type it.
    • #相当于retain,在不再使用的时候被释放 (默认)
  • __weak
    • means the object can be destroyed at anytime.
    • This is only useful if the object is somehow strongly referenced somewhere else.
    • When destroyed, a variable with __weak is set to nil.
    • #与assign很像,不同在于如果指向的数据被释放了,那么这个指向nil
  • __unsafe_unretained
    • is just like __weak but the poiner is not set to nil when the object is deallocated.
    • Instead the pointer is left dangling (i.e. it no longer points to anything useful).
    • #相当于assign,指向的数据如果被释放,这个指向原来的地址
  • __autoreleasing
    • not to be confused with calling autorelease on an object before returning it from a method, this is used for passing objects by reference, for example when passing NSError objects by reference such as [myObject performOperationWithError:&tmp];
    • #标明传给函数的(id*)型参数是自动释放的,(函数中(id*)型参数默认的也是这种类型)  
<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

Toll-Free Bridging/CF和ObjC转换

  • 在没有开启ARC时,可以进行强制转换.
    • CFStringRef aCFString = (CFStringRef)aNSString;
    • NSString *aNSString = (NSString *)aCFString;
  • __bridge
    • 简单赋值,不会影响两边对象的retain count.

      id my_id;

      CFStringRef my_cfref;

      NSString *a = (__bridge NSString*)my_cfref;

      CFStringRef b = (__bridge CFStringRef)my_id;

  • __bridge_retained or CFBridgingRetain
    • 保留赋值,赋值后也保留不释放右边的对象
  • __bridge_transfer or CFBridgingRelease
    • 释放赋值,赋值后释放右边的对象
  • 例子
    • -(void)test

      {

          CFStringRef coreFoundationString = CFStringCreateWithCString(CFAllocatorGetDefault(),"C String", kCFStringEncodingUTF8);    // 创建 retainCount = 1

          id unknownObjectType = (__bridge  id)coreFoundationString; // 简单赋值,不变,retainCount = 1

          CFStringRef anotherString = (__bridge_retained  CFStringRef)unknownObjectType; // 保留赋值,加一,retainCount = 2

          NSString *objCString = (__bridge_transfer  NSString *)coreFoundationString; // 释放赋值,减一,retainCount =1;由于NSString*默认strong,加一,retainCount = 2

          NSLog(@"String = %@", objCString);

          objCString = nil;   // 不再指向原内存,原内存减一,retainCount = 1

          CFRelease(anotherString);   // 释放,减一,retainCount = 0

      }

  • 转换宏
    • #if __has_feature(objc_arc)

      #   define objc_retainedObject(o) ((__bridge_transfer id)(objc_objectptr_t)(o))

      #   define objc_unretainedObject(o) ((__bridge id)(objc_objectptr_t)(o))

      #   define objc_unretainedPointer(o) ((__bridge objc_objectptr_t)(id)(o))

      #else

      #   define objc_retainedObject(o) ((id)(objc_objectptr_t)(o))

      #   define objc_unretainedObject(o) ((id)(objc_objectptr_t)(o))

      #   define objc_unretainedPointer(o) ((objc_objectptr_t)(id)(o))

      #endif     

@synthesize 和Dynamic ivars

@interface ClassA {

  //NSObject _objB; // instance varible or ivar,可以不写,编译器会自动生成

}

@property (retain) NSObject *objB; 

@end

 

@implement ClassA

@synthesize objB = _objB;

@end

 

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

@synthesize myProperty = myIvar; // a dynamic ivar named myIvar  will be generated

@synthesize anotherProperty;   // a dynamic ivar named anotherProperty  will be generated

<!-- ^ Position is not set to relative / absolute here because of Mozilla -->

  1. @synthesize是新特征,简化setter/getter方法;
  2. 能用retain/copy/assing,strong/wak管理内存
  3. 在init和dealloc函数中,不建议用synthesized accessors,它会trigger KVO notifications;它本质上是setter/getter,在不需要调用setter/getter的时候,就不要用

  4. 32bit Mac OS X不支持Dynamic ivar,必须手动什么iVar,否则无法编译
  5. 调试原因(我还不清楚这是什么意思,因为在self变量里可以找到ivar):For some reason the XCode debugger doesn't show properties that don't have corresponding ivars explicitly declared.       

self.abc = nil 与 _abc = nil的本质区别

 

    分享到:
    评论

    相关推荐

      爱立信MR解析工具

      爱立信MR解析工具是一款专为分析和理解爱立信移动网络中的测量报告(MRR)和网络配置存储(NCS)二进制文件而设计的应用。这些文件通常包含了大量的网络性能数据,对于网络运维人员来说,理解并解析这些数据至关重要...

      IOS高级内存管理编程指南.pdf

      随着ARC的出现,内存管理变得更加容易,但了解MRR对于编写库代码和处理特定的内存管理问题仍然很重要。对于想要编写高质量iOS应用的开发者来说,本指南提供了一套完整的内存管理策略和实践技巧。

      ios高级内存管理编程指南

      虽然本文主要介绍了手动保留-释放(Manual Retain-Release, MRR)的内存管理方式,但在现代iOS开发中,自动引用计数(Automatic Reference Counting, ARC)已成为首选的内存管理模式。了解这两种模式的基本原理和...

      如何使用Leak检查内存泄漏

      在iOS应用开发中,内存管理是一项至关...同时,开发过程中养成良好的内存管理习惯,比如遵循Apple的MRR(Memory Retirement Rule)原则,及时释放不再使用的对象,避免不必要的强引用,将极大地减少内存泄漏的发生。

      MRR应用介绍.ppt

      总的来说,MRR是移动通信网络优化的核心组成部分,它提供了关于网络性能和干扰情况的宝贵信息,帮助运营商提升网络效率和服务质量。通过无线信号测量、基站间干扰分析等多种手段,MRR数据在解决实际网络问题中发挥着...

      MRR的应用分析实例

      MRR通过收集和记录移动设备(手机)和基站之间的测量报告,帮助分析网络性能,识别并解决问题,进行参数调优以及频率规划。 **MRR数据采集功能模块** MRR、NCS(Network Control System)和FAS(Frequency ...

      爱立信MRR分析

      爱立信MRR分析是一种专门针对移动网络中的移动无线电资源管理(Mobile Radio Resource Management, MRR)数据进行深度分析的工具。MRR数据是通信网络中至关重要的组成部分,它记录了网络性能、用户行为以及无线资源...

      NCS_MRR_FAS_CTR_MTR定义

      这些定义主要用于收集、分析和管理网络中的关键性能指标,以确保网络运行的高效性和稳定性。 首先,NCS(Network Control System)是网络管理系统的一部分,用于控制和监控网络的各种操作。在描述中提到的RAB...

      MRRNCSFAS指令

      MRR指令专注于收集与移动网络中无线资源管理相关的数据,如手机在不同小区之间的切换、服务质量(QoS)指标等,对于分析网络性能和用户行为至关重要。 在示例中,`RAMIE`, `RAMII`, `RAMDC`, `RAMRI`, `RAMRP`, `...

      MRR_eccv12.zip_MRR

      标题"MRR_eccv12.zip_MRR"和描述中的"MRR"指的是“Mean Re-ranking”(平均重新排名)算法,这是一个在计算机视觉领域,特别是人脸识别技术中广泛使用的概念。在非对准人脸识别中,MRR是解决图像对齐不一致问题的一...

      【mysql】关于ICP、MRR、BKA等特性1

      ICP通过将过滤操作下推至存储引擎层减少不必要的数据读取,MRR通过排序和批量处理减少随机IO,而BKA则在连接操作中提升了处理效率。理解并合理运用这些特性,可以显著提升复杂查询在MySQL中的执行速度,降低系统资源...

      中距离雷达硬件CA D101—第 3 部分:操作—20131022—MRR1 Plus Hardware Part3 Handling

      总的来说,这份文档为博世的中距离雷达硬件CA D101—MRR1 Plus的使用者提供了全面的操作指南,确保了设备在整个生命周期内能够安全、高效地运行,同时也考虑到了潜在的定制化需求和不同应用场景。

      论文研究-MRR模型一类正态总体的极大似然估计法及检验.pdf

      论文研究-MRR模型一类正态总体的极大似然估计法及检验.pdf, Madhavan等给出了一个著名的价差分解模型:MRR模型. MRR模型利用广义矩方法估计参数,这使得该模型在扩展上...

      matlab仿真图_MRR_微环_

      标题“matlab仿真图_MRR_微环_”和描述中的关键词主要涉及到“微环”(Microring Resonator,MRR)和“matlab仿真”。微环是一种基于光子集成技术的重要组件,广泛应用于光学通信、光信号处理和传感器等领域。MATLAB...

      MySQL InnoDB MRR优化指南

      总的来说,MySQL InnoDB的MRR优化是数据库管理员和开发者优化查询性能的一个重要工具。正确理解和应用MRR,结合其他优化策略,如索引选择、查询结构优化等,可以显著提升系统整体的查询效率。在实际工作中,应密切...

      mrr2c:将Metek MRR-2微型雨雷达数据文件转换为HDF

      mrr2c 将Metek MRR-2微型雨雷达数据文件转换为NetCDF。 mrr2c是一个开源程序,可将Metek Micro Rain Radar 2(MRR-2)数据转换为NetCDF。 支持RAW,PRO和AVE文件。 注意:早期版本生成HDF5文件。 如果需要这种类型的...

      Et.rar_MRR_throughput_throughput signal

      标题“Et.rar_MRR_throughput_throughput signal”和描述“Simulation of throughput signal”涉及的是关于微波射频(Microwave Resonant Ring,MRR)器件的吞吐量(throughput)信号模拟的知识点。MRR是一种在光...

      中距离雷达硬件CA D101—第 1 部分:硬件功能—20131022—MRR1 Plus Hardware Part1 HW Functions.pdf

      同时,文档的审核流程涉及到多个部门,反映了博世公司在产品开发和文档管理上的严谨性。 总之,中距离雷达硬件CA D101是一款针对汽车安全应用的高端雷达传感器,其核心技术在于FMCW毫米波雷达系统,能够提供准确的...

      智能网优 “优”然自得

      再者,全网邻区自动优化方案解决了邻区管理的复杂性和重要性。由于TD-SCDMA系统特性,邻区优化工作尤为困难,但通过专业工具的支持,可以在初始邻区配置基础上,有效地进行邻区漏配添加和冗余邻区删除,提升网络性能...

    Global site tag (gtag.js) - Google Analytics