关于ARC
默认所以实例变量和本地变量都为 strong 类型的指针。
weak 指针主要用于“父-子”关系,父亲拥有一个儿子的 strong 指针,因此是儿子的所有者;但为了阻止所有权回环,儿子需要使用 weak 指针向父亲。例如 delegate 模式。
属性写法:
Array:
在ARC中这段代码完全合法,因为obj变量是一个 strong 指针,它成为了对象的拥有者, 从Array中移除该对象也不会导致对象被释放。
Xcode 的 ARC 自动迁移 ——>(iOS 5 ARC完全指南.ptf)
属性property:
.h 主要将属性定义由 retain 变为 strong
.m 实现中定义 private(私有)实例变量:
@implementation MainViewController
{
…………………………
NSOperationQueue *queue;
NSMutableArray *searchResults;
SoundEffect *soundEffect;
…………………………
}
在使用时,虽然没有定义 property,也可以直接
[self.soundEffect play];
IBOutlet:
在ARC中,所有 *outlet* 属性都推荐使用 weak。唯一应该使用 strong 的 outlet 是 File’s Owner, 连接到 nib 的顶层对象。
将 outlet 定义未 weak 的优点是简化了 viewDidUnload 方法的实现:
- (void)viewDidUnload
{
[super view DidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
现在可以简化为:
- (void)viewDidUnload
{
[super view DidUnload];
soundEffect = nil;
}
因为 tableView 和 searchBar 这两个 property 定义为 weak, 当它们指向的对象被释放时, 这两个变量会自动设置为nil。
viewDidUnload() 方法里面需要设置所有非 outlet 变量为 nil, 同样还有 didReceiveMemoryWarning() 方法。
property 的修饰符总结如下:
strong: 等同于“retain”,属性成为对象的拥有者
weak: 属性是 weak pointer, 当对象释放时会自动设置为nil, 记住 Outlet 应该使用 weak
unsafe_unretained: 等同于之前的 “assign”,只有 iOS 4 才应该使用
copy: 和之前的 copy 一样, 复制一个对象并创建 strong 关联
assign: 对象不能使用 assign, 但原始类型 (BOOL、 int、 float)仍然可以使用
readonly property (只读):
使用 class extension 重新定义 property 为 readwrite;
.h
@interface WeatherPredictor
@property (nonatomic, strong, readonly) NSNumber *temperature;
@end
.m
@interface WeatherPredictor ()
@property (nonatomic, strong, readwrite) NSNumber *temperature;
dealloc方法:
如果在 dealloc 方法内处理了其它资源 (非内存)的释放,如定时器、CoreFoundation对象,则仍需要在方法内进行,如CFRelease()、free()等。
如:
- (void)dealloc
{
AudioServicesDisposeSystemSoundID(soundID);
}
AutoreleasePool:
如:
NSAutoreleasePool *pool = [NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain (argc, argv, nil, NSStringFromClass([AppDelegate class]));
[pool release];
return retVal;
修改为:
@autoreleasepool{
int retVal = UIApplicationMain (argc, argv, nil, NSStringFromClass([AppDelegate class]));
return retVal;
}
默认所以实例变量和本地变量都为 strong 类型的指针。
weak 指针主要用于“父-子”关系,父亲拥有一个儿子的 strong 指针,因此是儿子的所有者;但为了阻止所有权回环,儿子需要使用 weak 指针向父亲。例如 delegate 模式。
属性写法:
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, weak)id <MyDelegate>delegate;
Array:
id obj = [array objectAtIndex:0];
[array removeObjectAtIndex:0];
NSLog(@“%@”, obj);
在ARC中这段代码完全合法,因为obj变量是一个 strong 指针,它成为了对象的拥有者, 从Array中移除该对象也不会导致对象被释放。
Xcode 的 ARC 自动迁移 ——>(iOS 5 ARC完全指南.ptf)
属性property:
.h 主要将属性定义由 retain 变为 strong
.m 实现中定义 private(私有)实例变量:
@implementation MainViewController
{
…………………………
NSOperationQueue *queue;
NSMutableArray *searchResults;
SoundEffect *soundEffect;
…………………………
}
在使用时,虽然没有定义 property,也可以直接
[self.soundEffect play];
IBOutlet:
在ARC中,所有 *outlet* 属性都推荐使用 weak。唯一应该使用 strong 的 outlet 是 File’s Owner, 连接到 nib 的顶层对象。
将 outlet 定义未 weak 的优点是简化了 viewDidUnload 方法的实现:
- (void)viewDidUnload
{
[super view DidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
现在可以简化为:
- (void)viewDidUnload
{
[super view DidUnload];
soundEffect = nil;
}
因为 tableView 和 searchBar 这两个 property 定义为 weak, 当它们指向的对象被释放时, 这两个变量会自动设置为nil。
viewDidUnload() 方法里面需要设置所有非 outlet 变量为 nil, 同样还有 didReceiveMemoryWarning() 方法。
property 的修饰符总结如下:
strong: 等同于“retain”,属性成为对象的拥有者
weak: 属性是 weak pointer, 当对象释放时会自动设置为nil, 记住 Outlet 应该使用 weak
unsafe_unretained: 等同于之前的 “assign”,只有 iOS 4 才应该使用
copy: 和之前的 copy 一样, 复制一个对象并创建 strong 关联
assign: 对象不能使用 assign, 但原始类型 (BOOL、 int、 float)仍然可以使用
readonly property (只读):
使用 class extension 重新定义 property 为 readwrite;
.h
@interface WeatherPredictor
@property (nonatomic, strong, readonly) NSNumber *temperature;
@end
.m
@interface WeatherPredictor ()
@property (nonatomic, strong, readwrite) NSNumber *temperature;
dealloc方法:
如果在 dealloc 方法内处理了其它资源 (非内存)的释放,如定时器、CoreFoundation对象,则仍需要在方法内进行,如CFRelease()、free()等。
如:
- (void)dealloc
{
AudioServicesDisposeSystemSoundID(soundID);
}
AutoreleasePool:
如:
NSAutoreleasePool *pool = [NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain (argc, argv, nil, NSStringFromClass([AppDelegate class]));
[pool release];
return retVal;
修改为:
@autoreleasepool{
int retVal = UIApplicationMain (argc, argv, nil, NSStringFromClass([AppDelegate class]));
return retVal;
}