ios - 对__bridge,_bridge_retain和_bridge_transfer的疑问

标签 ios objective-c memory types casting

我已经阅读了有关__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设置为nilARC将介入并取消分配字符串。这样就释放了那部分内存,但是cfString仍然指向那里,从而导致指针错误的访问异常。与我的推理相反,输出为123并且为null,当然程序不会崩溃。

而且,如果我更换
self.test = nil;


CFRelease(cfString);

我预计由于类似的原因,程序也会崩溃。甚至更奇怪的是输出现在是123和123。

有人可以详细说明为什么吗?顺便说一句,所有权一词总是困扰我,有些解释将不胜感激。

最佳答案

您的问题是您使用的是常量字符串。它直接放入程序存储器中,因此尽管事实并非如此,但该引用却意外地保持有效。使用比常量字符串小的常量,程序将像您想象的那样刹车。

关于ios - 对__bridge,_bridge_retain和_bridge_transfer的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443848/

相关文章:

objective-c - 了解 Objective-C 中选择器的唯一性

c++ - 在没有内存开销的情况下设置 Eigen::SparseMatrix 的稀疏模式

在 liferay 中上传大量文档文件时,Linux 服务器的内存不会释放

ios - 为什么应用程序是:didReceiveLocalNotification's notification parameter NULL on entry?

ios - iOS 7 中的半透明导航栏

ios - NSPredicate 过滤没有结果

objective-c - 来自 NSDate 的 NSNumber

C - 为包含字符串的表动态分配内存

android - 使 iOS/Android HTTP 请求看起来像是来自 PC 浏览器?

iphone - 如何获取键盘大小以调整 UITextView 的大小以及如何在日文键盘上使用 UIKeyboardFrameEndUserInfoKey?