gpt4 book ai didi

ios - 对__bridge,_bridge_retain和_bridge_transfer的疑问

转载 作者:行者123 更新时间:2023-12-01 18:51:57 25 4
gpt4 key购买 nike

我已经阅读了有关__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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com