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作一個過濾

相關文章
相關標籤/搜索