您的位置:首页 > 其它

ARC学习笔记

2015-06-30 14:32 323 查看
ARC
默认所有的实例变量和本地变量都是“strong”,因为它们能够保持对象的生命。
__weak NSString *weakName = self.textFidld.text; 父与子的关系就需要用到weak,就像delegate就需要用weak.
String对象没有拥有者(weak指针),在创建之后会被立即释放.
变量默认就是__strong类型的。

1.AutoreleasePool作用域的问题
2.c struct不能使用OC对象.
3.iboult推荐使用weak

Dealloc
会需要释放定期器,core Foundation对象等.

AutoreleasePool
依然保留,用了新的block语法.

Toll-Free Bridging
当Object-C和Core Foundation对象之间进行转换时,就需要使用Bridge cast。
MRC CFStringRef s1 = (CFStringRef)[[NSString alloc] initWithFormat:@"Hello,%@!",name];//MRC的时候只需要一个强制类型转换就行了.
CFRelease(s1);
MRC:从Core Foundation 到Objective-C的方向也类似:
CFStringRef s2 = CFStringCreateWithCString(KCFAllocatorDefault,bytes,KCFStringEncodingMacRoman);
NSString *s3 = (NSString *)s2;
[s3 release];

ARC保持这个变量的所有权,又希望临时将它当作CFStringRef对象来使用,这种情况下需要使用__bridge说明符.(它告诉不要更改对象的所有权,按普通规则释放该对象即可)
多数情况下,Object-c和Core Foundation对象之间互相转换时,都应该使用__bridge.
__bridge_transfer:给予ARC所有权
__bridgr_retained:解除ARC所有权

只要调用命名为creat,Copy,Retain,的Core Foundation函数,都需要使用CFBridgingRelease()安全地将值传给ARC。

变成NSobject对象就 给予ARC所有权。 辅助函数CFBridgingRelease();
变成Core Foundation对象就 解除ARC所有权. 辅助函数CFBridgingRetain();
举例:
NSString *s1 = [[NSString alloc] initWithformat:@"Hello,%@!",name];
CFStringRef s2 = (_bridge_retained CFStringRef)s1;
CFRelease(s2);

如果需要Objective-c对象和void *互相转换,也需要使用__bridge转换.

MyClass *myObject = [[MyClass alloc] init];

[UIView beginAnimations:nil context:(__bridge void *)myObject];

- (void)animationDidStart:(NSString *)animationID

context:(void *)context{

MyClass *myObject = (__bridge MyClass *)context;//用的时候还需要转回来.

}

总结:

使用 CFBridgingRelease(),从Core
Foundation 传递所有权给Objective-C;

使用 CFBridgingRetain(),从Objective-C传递所有权给
CoreFoundation;

使用__brideg,表示临时使用某种类型,不改变对象的所有权

Delegate和Weak Property

unsafe_unretained(编译器不会自动为其添加retain和release)为ios4准备的不需要了解.'

ARC的高级指南

ARC中的Block知识普及:

Block会捕获自己使用到的所有变量。如果这些变量是指针,会对每个对象retain。

Block的知识普及:Block在堆栈中初始创建,如果你需要在超出当前作用域之后,仍然保持Block继续存在,必须使用[copy]或block_copy()将Block复制到堆。

Block使用copy关键字,使用strong会直接崩溃。

使用NSTimer会产生所有权回环的问题。关于NStimer产生的回环,用

- (void)stopAnimation

{

[timer invalidate], timer = nil;

}

方法来打破回环。(强制释放timer)

DetailViewController和Block之间的回环。Block里面不使用self.就可以。
1)如果不能避免使用self. 在MRC中:
__block DetailViewController *blockSelf = self;//__block关键字表示Block不retain这个变量,但是ARC却不能用这种方法。
self.animatedView.block = ^{
[blockSelf.artistName 来访问]
}
2)在ARC中://普通情况下直接使用weakSelf就可以了

__weak id weakSelf = self;

block = ^(){

id strongSelf = weakSelf;

if (strongSelf != nil)


{

// do stuff with strongSelf

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: