ARC工程中添加非ARC文件

 

转载自:http://blog.csdn.net/zhenweicao/article/details/16988543

分类: IOS

转自:http://www.cnblogs.com/jiangshiyong/archive/2013/03/01/2938895.htmlhtml

 

ARC工程中添加非ARC文件objective-c

转自http://blog.csdn.net/nicktang/article/details/6792972编程

Automatic Reference Counting (ARC) 是一个编译期的技术,利用此技术能够简化Objective-C编程在内存管理方面的工做量。app

ARC与非ARC在一个项目中同时使用,ide

1,选择项目中的Targets,选中你所要操做的Target,函数

2,选Build Phases,在其中Complie Sources中选择须要ARC的文件双击,并在输入框中输入:-fobjc-arc,若是不要ARC则输入:-fno-objc-arc工具

Apple 文档oop

http://developer.apple.com/library/IOs/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.htmlpost

ARC是objc的将来ui

须要知道的一些事

一、你须要下载Xcode 4.2

二、ARC是编译器LLVM 3.0的新功能,而非iOS,所以ARC支持 Mac OS X v10.6 v10.7(64-bit applications) 以及 iOS 4 iOS 5. (遗憾的是,weakreference是runtime属性,所以 不支持 iOS 4 和 Mac OS X v10.6。)

三、你不能使用new开头的变量

四、可使用 -fno-objc-arc 来标识哪些文件不使用ARC机制,对于不少第三方库来讲颇有用,能让咱们顺利经过过渡期。

五、ARC只对objective-c对象起做用,对于Core Foundation 之类,你仍然须要本身手动释放。

 

ARC的优点:

自动计数(ARC)是一个编译期间工做的可以帮你管理内存的技术,经过它,程序人员能够不须要在内存的retain,释放等方面花费精力。

ARC在编译期间为每一个Objective-C指针变量添加合适的retain, release,autorelease等函数,保存每一个变量的生存周期控制在合理的范围内,以期实现代码上的自动内存管理。

In order for the compiler to generate correct code, ARCimposes some restrictions on the methods you can use, and on how you usetoll-free bridging (see “Toll-Free Bridged Types”); ARC alsointroduces new lifetime qualifiers for object references and declaredproperties.

你可使用编译标记-fobjc-arc来让你的工程支持ARC。ARC在Xcode4.2中引入,在Mac OS X v10.6,v10.7 (64位应用),iOS 4,iOS 5中支持,Xcode4.1中不支持这个技术.

若是你如今的工程不支持ARC技术,你能够经过一个自动转换工具来转换你的工程(工具在Edit>Refactor>Convertto Objective-C ARC),这个工具会自动全部工程中手动管理内存的点转换成合适自动方式的(好比移除retain, release等)。这个工具会转换工程中全部的文件。固然你能够转换单个文件。

ARC使得你不须要再思考什么时候使用retain,release,autorelease这样的函数来管理内存,它提供了自动评估内存生存期的功能,而且在编译期间自动加入合适的管理内存的方法。编译器也会自动生成dealloc函数。通常状况下,经过ARC技术,你能够不顾传统方式的内存管理方式,可是深刻了解传统的内存管理是十分有必要的。

下面是一个person类的一个声明和实现,它使用了ARC技术。

@interface Person : NSObject

@property (nonatomic, strong) NSString*firstName;

@property (nonatomic, strong)NSString *lastName;

@property (nonatomic, strong)NSNumber *yearOfBirth;

@property (nonatomic, strong) Person*spouse;

@end

@implementation Person

@synthesize firstName, lastName,yearOfBirth, spouse;

@end

(有关strong的帮助,请参考 “ARC Introduces New Lifetime Qualifiers.”)

使用ARC,你能够象下面的方式实现contrived函数:

- (void)contrived {

  Person *aPerson = [[Person alloc]init];
  [aPersonsetFirstName:@"William"];
  
  [aPerson setLastName:@"Dudney"];

  [aPerson:setYearOfBirth:[[NSNumberalloc] initWithInteger:2011]];

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

}

ARC管理内存,因此这里你不用担忧aPerson和NSNumber的临时变量会形成内存泄漏。

你还能够象下面的方式来实现Person类中的takeLastNameFrom:方法,

- (void)takeLastNameFrom:(Person*)person {

  NSString *oldLastname = [selflastName];

  [self setLastName:[person lastName]];

  NSLog(@"Lastname changed from %@to %@", oldLastname, [self lastName]);

}

ARC能够保证在NSLog调用的时候,oldLastname还存在于内存中。

为了ARC能顺利工做,特增长以下规则,这些规则多是为了更健壮的内存管理,也有可能为了更好的使用体验,也有多是简化代码的编写,不论如何,请不要违反下面的规则,若是违反,将会获得一个编译期错误。

 

下面的这些函数:dealloc,retain, release, retainCount, autorelease。禁止任何形式调用和实现(dealloc可能会被实现),包括使用@selector(retain), @selector(release)等的隐含调用。

· 下面的这些函数:dealloc,retain, release, retainCount, autorelease。禁止任何形式调用和实现(dealloc可能会被实现),包括使用@selector(retain), @selector(release)等的隐含调用。

  你可能会实现一个和内存管理没有关系的dealloc,譬如只是为了调用[systemClassInstance setDelegate:nil] ,可是请不要调用[super dealloc] ,由于编译器会自动处理这些事情。

·  你不可使用NSAllocateObject或者NSDeallocateObject.

使用alloc申请一块内存后,其余的均可以交给运行期的自动管理了。

· 不能在C语言中的结构中使用Objective-c中的类的指针。

请使用类类管理数据。

· 不能使用NSAutoreleasePool.

做为替代,@autoreleasepool被引入,你可使用这个效率更高的关键词。

·不能使用memory zones.

NSZone再也不须要—原本这个类已经被现代Objective-c废弃。

ARC在函数和便利变量命名上也有一些新的规定

·  禁止以new开头的属性变量命名。

ARC Introduces New Lifetime Qualifiers

ARC introduces several new lifetime qualifiers forobjects, and zeroing weak references. A weak reference does not extend thelifetime of the object it points to. A zeroing weak reference automaticallybecomes nil if the object itpoints to is deallocated.

You should take advantage of these qualifiers to managethe object graphs in your program. In particular, ARC does not guardagainst strong reference cycles (previously known as retaincycles—see “Practical Memory Management”). Judicious useof weak relationships will help to ensure you don’t create cycles.

属性变量修饰符

weak和strong两个修饰符是新引进的,使用例子以下:

// 下面的做用和: @property(retain) MyClass*myObject;相同

@property(strong) MyClass *myObject;

// 下面的做用和"@property(assign) MyClass*myObject;"相识

// 不一样的地方在于,若是MyClass的实例析构后,这个属性变量的值变成nil,而不是一个野指针,

@property(weak) MyClass *myObject;

自动释放池

使用ARC,你不能使用NSAutoReleasePool类来管理自动释放池了,做为替代,ARC使用一个新的语法结构:

@autoreleasepool {

// Code, such as a loop that createsa large number of temporary objects.

}

编译器根据工程是否使用ARC,来决定这个语法结构最终呈现方式,这个语法结构使用了一种比NSAutoReleasePool更高效的方式。

其余的新功能

使用ARC技术,可使得在栈上分配的指针隐式的初始化为nil,好比

- (void)myMethod {

  NSString *name;

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

}

上面的代码会Log出来一个null,不会象不使用ARC技术的时候使得程序崩溃。

 

ARC在工程上的相关设置

在建立工程的时候,咱们能够指定工程是否使用ARC技术,以下图

 

选中表示支持ARC,

在Beta5之前的版本中,不提供这个选项,很是麻烦。

若是是你拿到的工程,那么能够经过设置来改变,以下图所示

 

若是不容易找到,能够在设置的右上角输入ARC作一个过滤

相关文章
相关标签/搜索