gpt4 book ai didi

objective-c - 圆弧 : __bridge versus __bridge_retained using contextInfo test case

转载 作者:太空狗 更新时间:2023-10-30 03:48:34 27 4
gpt4 key购买 nike

考虑这个 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:] 这样的类初始值设定项自动释放?

最佳答案

一般情况下都是

// 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: 方法中。不要求主程序持有一个强引用,所以这是安全的方法。

关于objective-c - 圆弧 : __bridge versus __bridge_retained using contextInfo test case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com