请考虑以下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:] )自动释放的字符串
发布于 2013-12-30 15:36:12
一般情况下,
// 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:方法中释放。不需要主程序有很强的引用,所以这是安全的方法。
https://stackoverflow.com/questions/20842310
复制相似问题