ARC:__bridge与__bridge_retained使用contextInfo测试用例

时间:2013-12-30 15:19:27

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

考虑这个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:]

等类初始化程序自动释放

1 个答案:

答案 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:方法中。主程序不需要 一个强有力的参考,所以这是安全的方法。