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是一样的),不需要/不能使用下面这些方法
- 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 -->
- @synthesize是新特征,简化setter/getter方法;
- 能用retain/copy/assing,strong/wak管理内存
-
在init和dealloc函数中,不建议用synthesized accessors,它会trigger KVO
notifications;它本质上是setter/getter,在不需要调用setter/getter的时候,就不要用
-
32bit Mac OS X不支持Dynamic ivar,必须手动什么iVar,否则无法编译
-
调试原因(我还不清楚这是什么意思,因为在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的本质区别
分享到:
相关推荐
随着ARC的出现,内存管理变得更加容易,但了解MRR对于编写库代码和处理特定的内存管理问题仍然很重要。对于想要编写高质量iOS应用的开发者来说,本指南提供了一套完整的内存管理策略和实践技巧。
爱立信MR解析工具是一款专为分析和理解爱立信移动网络中的测量报告(MRR)和网络配置存储(NCS)二进制文件而设计的应用。这些文件通常包含了大量的网络性能数据,对于网络运维人员来说,理解并解析这些数据至关重要...
虽然本文主要介绍了手动保留-释放(Manual Retain-Release, MRR)的内存管理方式,但在现代iOS开发中,自动引用计数(Automatic Reference Counting, ARC)已成为首选的内存管理模式。了解这两种模式的基本原理和...
在iOS应用开发中,内存管理是一项至关...同时,开发过程中养成良好的内存管理习惯,比如遵循Apple的MRR(Memory Retirement Rule)原则,及时释放不再使用的对象,避免不必要的强引用,将极大地减少内存泄漏的发生。
总的来说,MRR是移动通信网络优化的核心组成部分,它提供了关于网络性能和干扰情况的宝贵信息,帮助运营商提升网络效率和服务质量。通过无线信号测量、基站间干扰分析等多种手段,MRR数据在解决实际网络问题中发挥着...
MRR通过收集和记录移动设备(手机)和基站之间的测量报告,帮助分析网络性能,识别并解决问题,进行参数调优以及频率规划。 **MRR数据采集功能模块** MRR、NCS(Network Control System)和FAS(Frequency ...
爱立信MRR分析是一种专门针对移动网络中的移动无线电资源管理(Mobile Radio Resource Management, MRR)数据进行深度分析的工具。MRR数据是通信网络中至关重要的组成部分,它记录了网络性能、用户行为以及无线资源...
这些定义主要用于收集、分析和管理网络中的关键性能指标,以确保网络运行的高效性和稳定性。 首先,NCS(Network Control System)是网络管理系统的一部分,用于控制和监控网络的各种操作。在描述中提到的RAB...
MRR指令专注于收集与移动网络中无线资源管理相关的数据,如手机在不同小区之间的切换、服务质量(QoS)指标等,对于分析网络性能和用户行为至关重要。 在示例中,`RAMIE`, `RAMII`, `RAMDC`, `RAMRI`, `RAMRP`, `...
标题"MRR_eccv12.zip_MRR"和描述中的"MRR"指的是“Mean Re-ranking”(平均重新排名)算法,这是一个在计算机视觉领域,特别是人脸识别技术中广泛使用的概念。在非对准人脸识别中,MRR是解决图像对齐不一致问题的一...
标题“matlab仿真图_MRR_微环_”和描述中的关键词主要涉及到“微环”(Microring Resonator,MRR)和“matlab仿真”。微环是一种基于光子集成技术的重要组件,广泛应用于光学通信、光信号处理和传感器等领域。MATLAB...
ICP通过将过滤操作下推至存储引擎层减少不必要的数据读取,MRR通过排序和批量处理减少随机IO,而BKA则在连接操作中提升了处理效率。理解并合理运用这些特性,可以显著提升复杂查询在MySQL中的执行速度,降低系统资源...
论文研究-MRR模型一类正态总体的极大似然估计法及检验.pdf, Madhavan等给出了一个著名的价差分解模型:MRR模型. MRR模型利用广义矩方法估计参数,这使得该模型在扩展上...
MRR1 Plus Hardware作为博世第一代中距离雷达系统,主要应用于HDI、ACC base、EBA和AEB等功能。这些功能极大提升了汽车的主动安全性能,使得汽车在自动驾驶和辅助驾驶方面具有了更强的感知能力。毫米波雷达之所以...
总的来说,MySQL InnoDB的MRR优化是数据库管理员和开发者优化查询性能的一个重要工具。正确理解和应用MRR,结合其他优化策略,如索引选择、查询结构优化等,可以显著提升系统整体的查询效率。在实际工作中,应密切...
mrr2c 将Metek MRR-2微型雨雷达数据文件转换为NetCDF。 mrr2c是一个开源程序,可将Metek Micro Rain Radar 2(MRR-2)数据转换为NetCDF。 支持RAW,PRO和AVE文件。 注意:早期版本生成HDF5文件。 如果需要这种类型的...
标题“Et.rar_MRR_throughput_throughput signal”和描述“Simulation of throughput signal”涉及的是关于微波射频(Microwave Resonant Ring,MRR)器件的吞吐量(throughput)信号模拟的知识点。MRR是一种在光...
同时,文档的审核流程涉及到多个部门,反映了博世公司在产品开发和文档管理上的严谨性。 总之,中距离雷达硬件CA D101是一款针对汽车安全应用的高端雷达传感器,其核心技术在于FMCW毫米波雷达系统,能够提供准确的...
理解内存管理是Objective-C开发者的重要技能,早期版本中需手动管理内存(MRR),现在通常使用ARC(Automatic Reference Counting)自动管理。 三、继承和多态 1. **继承**:Objective-C支持单一继承,子类可以继承...