首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ARC:__bridge与__bridge_retained使用contextInfo测试用例

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

Stack Overflow用户
提问于 2013-12-30 15:19:27
回答 1查看 4.1K关注 0票数 5

请考虑以下ARC代码:

代码语言:javascript
运行
复制
- (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:] )自动释放的字符串

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-30 15:36:12

一般情况下,

代码语言:javascript
运行
复制
// Object to void *:
contextInfo:(__bridge void *)s

// void * to object:
NSString *s = (__bridge NSString *)context;

代码语言:javascript
运行
复制
// 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:方法中释放。不需要主程序有很强的引用,所以这是安全的方法。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20842310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档