在XCode 4.2中,使用模板新建一个工程,该工程将使用ARC特性。
如果你的iOS SDK是iOS5 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将让你远离烦人且容易遗漏的retain,release和autorelease等操作。
ARC的工作原理是,在你编译程序时,将内存操作的代码(或)自动添加到需要的位置。即底层上使用和Manual Reference Counting(手工引用计数)一样的内存管理机制,但由于XCode自动帮你在编译时添加内存操作的代码,从而简化了编程的工作。
启用,编译选项中需加上-fobjc-arc,不过这个由XCode在创建工程模板时帮你完成。
4.2以前版本的都不支持。
对操作系统也有要求:Mac OS X v10.6 或v10.7 (64-bit applications),iOS4或iOS5。注意:其中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;
sstring *lastName;
@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方法,不能重载或直接调用retainreleaseretainCount或autorelease等方法。
但可以通过@selector(retain)@selector(release)这样的形式调用。
用户自定义的dealloc方法,不能调用[super dealloc] ,编译器会自动帮你添加这个代码。
对Core Foundation-style 的对象,仍可以使用CFRetain,CFRelease等方法。
-
不能使用NSAllocateObject或NSDeallocateObject去创建对象,请使用alloc方法。
-
在c语言中的结构体中,不能再使用对象指针。请放弃C结构体,使用Objective-C的类。
-
id和void*之间没有隐式的类型转换,请使用显式类型转换。
-
不能使用NSAutoreleasePool,ARC提供了@autoreleasepool语句块。
例如:
@autoreleasepool {
// Code,such as a loop that creates a large number of temporary objects.
}
-
NSZone。
-
方法和变量的命名不能以“new”开头。
关于对象的生命周期:
例如:
和@property(retain) MyClass *myObject;是等效的。
又例如:
@property(weak) MyClass *myObject; 和@property(assign) MyClass *myObject;在多数情况下等效,但当instance被释放时,设置为weak的引用会指向nil。
可用的限定词:
-
__strong, 默认的
-
__weak
-
__unsafe_unretained, 和weak的区别是当对象被释放时,引用不指向nil。
使用__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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。