【问题标题】:ARC: __bridge versus __bridge_retained using contextInfo test caseARC:__bridge 与 __bridge_retained 使用 contextInfo 测试用例
【发布时间】:2014-01-17 12:03:09
【问题描述】:

考虑一下这个 ARC 代码:

- (void)main {
    NSString *s = [[NSString alloc] initWithString:@"s"];
    [NSApp beginSheet:sheet 
           modalForWindow:window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:context:) 
           contextInfo:(__bridge void *)s
    ];
}

- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode context:(void *)context {
    NSString *s = (__bridge_transfer NSString *)context;
}

问题:在第 7 行,应该使用__bridge,还是使用__bridge_retained,或者这无关紧要,还是选择取决于字符串的保留计数(即字符串是显式分配还是自动释放通过像+[NSString stringWithString:]这样的类初始化器?

【问题讨论】:

  • 这不是完全相同的副本,但可能会回答您的问题:stackoverflow.com/q/12916491/1445366。 (另外,与您的问题无关:此 NSApp 方法在 OS X 10.9 中已弃用。)
  • 当你选择一个而不是另一个时,这很重要。如果您使用 bridge_retained,那么您有责任释放保留的对象,但如果您使用 __bridge,ARC 会为您处理它。
  • @ldindu:如果 __bridge_retained 与(恰好一个)__bridge_transfer 匹配,ARC 也会“处理”释放对象。
  • @Martin R 同意你的说法,我在 __bridge 和 __bridge_retained 之间进行解释,因为 Steveo 没有提到过桥转移,所以留下了解释。
  • 考虑使用 CFBridgingRetain() 和 CFBridgingRelease() 代替 __bridge_retained 和 __bridge_transfer。它们做同样的事情,但您可能会发现 CF 函数更容易推理。

标签: objective-c memory-management automatic-ref-counting retaincount toll-free-bridging


【解决方案1】:

一般来说都是

// Object to void *:
contextInfo:(__bridge void *)s

// void * to object:
NSString *s = (__bridge NSString *)context;

// Object to void *, retaining the object:
contextInfo:(__bridge_retained void *)s

// void * to object, transferring ownership.
// The object is released when s goes out of scope:
NSString *s = (__bridge_transfer NSString *)context;

在第一种情况下,没有所有权转移,因此主程序 只要工作表处于活动状态,必须持有对对象的强引用

第二种情况,创建sheet时对象被保留,被释放 在sheetDidEnd: 方法中。不需要主程序持有 强引用,所以这是安全的方法。

【讨论】:

  • 第三种情况:设置上下文时使用 __bridge_retained 或 CFBridgingRetain(),但使用上下文时使用普通的 __bridge 强制转换。这在上下文应该永远存在但没有其他方便的地方来存储对其的强引用时使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多