ARC学习笔记

来源:互联网 发布:挖机大转盘型号数据 编辑:程序博客网 时间:2024/05/01 02:32

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

}

}; 










0 0
原创粉丝点击