关于ARC

关于ARC


默认所以实例变量和本地变量都为 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;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值