热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS优化内存,提升性能之二

自动引用计数上面的那样处理过程,使得问题变得更加复杂,因为你总是要记住内存管理的规则,你需要知道什么时候在代码中加入retain,release,或者auto

自动引用计数


上面的那样处理过程,使得问题变得更加复杂,因为你总是要记住内存管理的规则,你需要知道什么时候在代码中加入retain,release,或者autorelease。因此,在新版Xcode(Xcode4.2),苹果发布了一个新的机制,使得retain,release,和autorelease自动执行。上面所有的策略依然可以应用在新版本的代码中。但是Xcode会为你添加内存管理需要的代码。


为了给你一个快速的了解,我重新编写Listing 7.1和Listing 7.2代码。


Listing 7.4. Rewrite Code for the New ARC mechanism

For Listing 7.1:
- (void)doSomething {

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

   NSLog(@"obj: %@", obj);

}

For Listing 7.3:
- (NSObject *)getObj {

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

       return obj;

}


就是这样!不在需要release或autorelease。当你编译代码的时候,Xcode会自动的为你添加release/autorelease相关代码。在编译器添加这些调用后,代码就和Listing 7.1和Listing 7.3一样了。


如何在Xcode中设置你的工程?


进入你的工程的settings,查找Objective-C Automatic ReferenceCounting是否设置为YES。你可以在图7-2的看到设置行的位置:


iOS优化内存,提升性能 之二


如果有一个已经使用了retain/release/autorelease的工程,你可以使用Xcode的migration工具来删除这些不需要的代码,如图7-3 。


iOS优化内存,提升性能 之二


ARC策略


你需要遵守一些新的规则来确保你的工程兼容ARC:

  • 你不能使用或调用旧的内存管理方法:retain,release,autorelease和retainCount。你可以复写dealloc方法做任何你需要清理的工作,但是你不能调用dealloc方法,例如[super dealloc]是不允许的。

       

       在构建属性的时候,这个规则也是强制要求的:


  1. @property (nonatomic, retain) NSString *myName; // 这是不允许的


  • 在c中不能使用对象指针,这会导致很多问题,如果你想在你的工程中集成c代码,如第9章所描述。你不能使用NSAutoreleasePool对象,必须使用@autoreleasepool。



       不能使用:

       

  1. NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];

  2. // your code here
    [pool release];

   

       必须使用:


  1. @autoreleasepool {

  2. // your code here

    }




ARC新的修饰符


根据新的ARC策略,你现在需要包含新的生命周期的修饰符来运用新的ARC规则。

  • strong:这个表示你想保持一个变量的强引用。只要有对象A的一个强引用,对象A就不会deallocated。

  • weak:这个和assign类似,如果你只是想要保持一个对象的引用,而又不想显示的拥有它。因此,你不需要管理这个对象的生命周期。一个比较好的情况是:如果对象A有对象B的一个弱引用,如果对象B被deallocated,那么这个引用会变成nil。这样是比较安全的,因为你不会拥有一个已经deallocated对象的引用。

  • unsafe_unretained:这个和weak类似,他们的不同之处是:对象A有对象B的一个引用,如果对象B被deallocated了,那么对象A的引用就会指向一个deallocated对象,这样会导致应用程序崩溃。

  • autoreleaseing:如果你有一个方法需要引用传递的参数,你可以考虑这个修饰符。当返回的时候,方法会负责autorelease这个参数。



对象属性


现在,你需要改变对象属性的声明。不要在使用之前版本的旧的内存管理机制:@property (retain) NSString *myString,现在有一个新的规则。


如果你想拥有一个对象的所有权


// This is similar to @property (retain) NSString *myString

@property(strong) NSString *myString;


如果你只是要持有一个对象的引用,而不是它的所有权


// This is similar to @property (assign) UIViewController *myViewController;

// except that if myViewController object is deallocated,
// the reference becomes nil.
@property(weak) UIViewController*myString;



注意:如果你想要你的应用运行在iOS4,你不能使用weak。你需要使用unsafe_unretained然后自己设置引用为nil。




变量声明


为了在方法内部使用这些修饰符,你需要在它的前面添加__(两个下划线)。例如,你可以使用__strong或__weak。在方法中,__strong是默认的修饰符。


使用__strong修饰符能确保你的对象一直存在直到方法结束,同时要小心使用__weak或__unsafe_unretained。如果没有强引用指向你的对象,你的对象会立即崩溃。例如:


NSString __weak *myString = @"hello world";

NSLog (@"myString: %@", myString);



将会打印(null),因为在打印时,已经没有强引用指向它。


__autoreleasing修饰符用来给方法接收一个引用传递的参数。


- (BOOL)performTaskWithError:(NSError *__autoreleasing *)error;


你可以正常的调用它:


NSError *error = nil;
[self performTaskWithError:&error];


默认,error对象声明为强引用,但是编译器会添加代码使得调用方法[self performTaskWithError:&error] ;



注意:对于返回对象的所有方法,同时没有包含new,alloc或copy,对象在返回是会自动的变为autoreleased。





推荐阅读
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
聂依依mma
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有