作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了有关__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);
最佳答案
您的问题是您使用的是常量字符串。它直接放入程序存储器中,因此尽管事实并非如此,但该引用却意外地保持有效。使用比常量字符串小的常量,程序将像您想象的那样刹车。
关于ios - 对__bridge,_bridge_retain和_bridge_transfer的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443848/
我是一名优秀的程序员,十分优秀!