Xcode 4.2 中的Automatic Reference Counting (ARC)

Xcode 4.2 中的Automatic Reference Counting (ARC),第1张

概述Automatic Reference Counting (ARC), 自动引用计数,是开发Cocoa程序时的一个编译级别的特性,用于自动内存管理。 在XCode 4.2中,使用模板新建一个工程,该工程将使用ARC特性。 如果你的iOS SDK是iOS5 seed release 2,需要做如下修改,才能避免编译时的错误: 在System/Library/Frameworks/CoreFounda automatic Reference Counting (ARC), 自动引用计数,是开发Cocoa程序时的一个编译级别的特性,用于自动内存管理。


XCode 4.2中,使用模板新建一个工程,该工程将使用ARC特性。

如果你的iOS SDKiOS5 seed release 2,需要做如下修改,才能避免编译时的错误:

System/library/Frameworks/CoreFoundation.framework/headers/CFBase.h,:

CFTypeRef CFMakeCollectable(CFTypeRef cf) CF_autoMATED_REFCOUNT_UNAVAILABLE;

修改成:

CFTypeRef CFMakeCollectable(CFTypeRef cf);

System/library/Frameworks/Foundation.framework/headers/NSObject.h:

return (__brIDge_retain CFTypeRef)X;

修改成:

return (__brIDge_retained CFTypeRef)X;


使用ARC将让你远离烦人且容易遗漏的retainreleaseautorelease等 *** 作。

ARC的工作原理是,在你编译程序时,将内存 *** 作的代码()自动添加到需要的位置。即底层上使用和Manual Reference Counting(手工引用计数)一样的内存管理机制,但由于XCode自动帮你在编译时添加内存 *** 作的代码,从而简化了编程的工作。

启用,编译选项中需加上-fobjc-arc,不过这个由XCode在创建工程模板时帮你完成。

4.2以前版本的都不支持

对 *** 作系统也有要求:Mac OS X v10.6 v10.7 (64-bit applications)iOS4iOS5。注意:其中Mac OS X v10.6不支持weak references(弱引用,后面会说明什么是weak references)Xcode 4.2提供了一个名为“Convert to Objective-C automatic Reference Counting”的工具,在Edit->Convert menu下,可以帮你自动将使用Manual Reference Counting的老代码转换成使用的新代码(例如去掉对retainrelease的调用)。

一个使用的代码例子:

@interface Person : NSObject

@property (nonatomic,strong) Nsstring *firstname;

@end


@implementation Person

@synthesize firstname,lastname,yearOfBirth,spouse; @end

注意:不再需要重载dealloc函数,因为没有release *** 作。(strong的语义后面会介绍。

例子2

(voID)contrived {

Person *aPerson = [[Person alloc] init];

[aPerson setFirstname:@"William"];

[aPerson setLastname:@"Dudney"];

[aPerson:setYearOfBirth:[[NSNumber alloc] initWithInteger:2011]];

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

}

注意:没有了 *** 作。

3(voID)takeLastnameFrom:(Person *)person {

Nsstring *oldLastname = [self lastname];

[self setLastname:[person lastname]];

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

注意:ARC会保证oldLastname引用的对象在NSLog执行结束之前,不会被释放掉。

使用的一些规则:

不能直接调用dealloc方法,不能重载或直接调用retainreleaseretainCountautorelease等方法。

但可以通过@selector(retain)@selector(release)这样的形式调用。

用户自定义的dealloc方法,不能调用[super dealloc] ,编译器会自动帮你添加这个代码。

Core Foundation-style 的对象,仍可以使用CFRetain,CFRelease等方法。

不能使用NSAllocateObjectNSDeallocateObject去创建对象,请使用alloc方法。

c语言中的结构体中,不能再使用对象指针。请放弃C结构体,使用Objective-C的类。

IDvoID*之间没有隐式的类型转换,请使用显式类型转换。

不能使用NSautoreleasePoolARC提供了@autoreleasepool语句块。

例如:

@autoreleasepool {

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

}

NSZone

方法和变量的命名不能以“new”开头。

关于对象的生命周期:

weak:设置成weak的属性,不会影响对象的生命周期,如果引用的对象已经被释放,引用会指向nil

strong引用:设置成的属性,会影响对象的生命周期。

例如:

@property(retain) MyClass *myObject;是等效的。

又例如:

@property(weak) MyClass *myObject; @property(assign) MyClass *myObject;在多数情况下等效,但当instance被释放时,设置为weak的引用会指向nil

可用的限定词:

__strong, 默认的

__weak

__unsafe_unretained, 和weak的区别是当对象被释放时,引用不指向nil

__autoreleasing,当方法的参数是ID*,且希望方法返回时对象被autoreleased,可以添加限定词。

使用__weak时要特别小心,例如

Nsstring __weak *string = [[Nsstring alloc] initWithFormat:@"First name: %@",[self firstname]];

NSLog(@"string: %@",string); //此时string为空,因为类型不影响对象的生命周期,对象刚创建就释放了。

其他特性:

使用strong,weak,autoreleasing限定的变量会被隐式初始化为nil

例如:

- (voID)myMethod { Nsstring *name;

NSLog(@"name: %@",name); //会输出null

}


原创地址:http://blog.sina.com.cn/s/blog_4c4c79950100t3uy.HTML 总结

以上是内存溢出为你收集整理的Xcode 4.2 中的Automatic Reference Counting (ARC)全部内容,希望文章能够帮你解决Xcode 4.2 中的Automatic Reference Counting (ARC)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1062577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存