我已经阅读了有关__bridge
,_bridge_retain
和_bridge_transfer
的信息,并做了一些实验。但是输出与我期望的不一致。特别是,我有以下代码:
@interface ViewController ()
@property (nonatomic, strong) NSString *test;
@end
@implementation ViewController
CFStringRef cfString;
- (void)viewDidLoad
{
[super viewDidLoad];
self.test = @"123";
cfString = (__bridge CFStringRef)self.test;
self.test = nil;
}
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"%@", cfString);
NSLog(@"%@", self.test);
}
基于以下原因,我希望程序崩溃:
_bridge
不转移所有权,因此在将self.test
转换为cfString
时,没有keepCount增量。一旦self.test
设置为nil
,ARC
将介入并取消分配字符串。这样就释放了那部分内存,但是cfString
仍然指向那里,从而导致指针错误的访问异常。与我的推理相反,输出为123并且为null,当然程序不会崩溃。而且,如果我更换
self.test = nil;
与
CFRelease(cfString);
我预计由于类似的原因,程序也会崩溃。甚至更奇怪的是输出现在是123和123。
有人可以详细说明为什么吗?顺便说一句,所有权一词总是困扰我,有些解释将不胜感激。
最佳答案
您的问题是您使用的是常量字符串。它直接放入程序存储器中,因此尽管事实并非如此,但该引用却意外地保持有效。使用比常量字符串小的常量,程序将像您想象的那样刹车。
关于ios - 对__bridge,_bridge_retain和_bridge_transfer的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443848/