【发布时间】: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