考虑这个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
,或者无关紧要,或者选择是否取决于字符串的保留计数(即字符串是否明确分配vs通过类+[NSString stringWithString:]
答案 0 :(得分:10)
通常,它是
// 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;
在第一种情况下,没有所有权转让,因此主要计划 只要工作表处于活动状态,就必须对该对象保持强烈的引用。
在第二种情况下,在创建工作表时保留对象并释放
在sheetDidEnd:
方法中。主程序不需要
一个强有力的参考,所以这是安全的方法。