- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试从 id __autoreleasing * 转换为 CFTypeRef * (void **)。
我试过:
id __autoreleasing *arg = [OCMArg setTo:mockData];
CFTypeRef expectedResult = (__bridge CFTypeRef) *arg;
[[[self.mockSecItemService expect] andReturnValue:OCMOCK_VALUE(mockCopyStatus)] copyItemMatching:queryCheck
result:&expectedResult];
但是当自动释放池被耗尽时代码崩溃。
如何在 ARC 环境中转换为 void**?
最佳答案
我不知道您使用的 API,所以我不能 100% 确定发生了什么。我用谷歌搜索,它们似乎是 OCMock 的一部分。我下载了它(因为我不感兴趣,所以没有安装)我快速浏览了源代码。
我在该代码中看到了一些可疑的东西。以下是他们如何实现您调用的第一个方法:
@implementation OCMArg
....
+ (id *)setTo:(id)value
{
return (id *)[[[OCMPassByRefSetter alloc] initWithValue:value] autorelease];
}
所以他们返回一个 id*
,它实际上只是一个 id
。
对我来说,这要么是胡说八道/错误,要么是试图操纵 ObjC 内部结构(即使没有记录,ObjC 对象存储的第一件事实际上是指向对象类的指针,因此类型为 Class
与 id
兼容,因此以某种方式将指向对象的指针或引用对象的 id
转换为 Class*< 是有效的
或 id*
)。我没有时间也没有兴趣去研究整个 API 来弄清楚他们为什么这样做。他们实际上可能有充分的理由(例如,如果您只将该结果传递给另一个知道它应该是什么的 API,但您在这里做的不止于此)。我不会研究 OCMock,而是会尽量向您解释正在发生的事情(ObjC 和 ARC)。
id __autoreleasing *arg = [OCMArg setTo:mockData];
ARC 在这行代码中绝对不会做任何事情。
上面那个方法是干什么的。 OCMPassByRefSetter
类是一个简单的类,它只是在保留参数后存储参数,因此保留了 mockData
。 OCMPassByRefSetter
是自动释放的,将在下一次耗尽时消失(释放 mockData
和 使 *arg
引用已释放内存)。
注意arg
实际上指向OCMPassByRefSetter
的isa
(isa
是“第一个"任何对象的 ivar,它是 Class
类型并指向对象的类。但这没有记录并且可能随时更改)。
CFTypeRef expectedResult = (__bridge CFTypeRef) *arg;
*arg
是与 CFTypeRef
兼容的 id
类型,因此转换有效。你使用 __bridge
所以 ARC 什么都不做。
如果 arg
指向“免费桥接”CF/Cocoa 类,这将是完全有效的代码,但您必须小心 expectedResult
会变得无效在下一个 drain 中(它不是 retained
,而是作为一个自动释放的实例存在)。
[[[self.mockSecItemService expect] andReturnValue:OCMOCK_VALUE(mockCopyStatus)] copyItemMatching:queryCheck
result:&expectedResult];
不知道这一行是做什么的。鉴于您在上面的评论中发布的原型(prototype),ARC 对 result:&expectedResult
部分不执行任何操作。
你说它是 SecItemCopyMatching
的包装器,但据我了解,它不止于此。如果它只是立即调用 SecItemCopyMatching
并将 result:
参数传递给它,您可能会把事情搞砸。但是名称 expectedResult
以及这是 OCMock 这一事实让我觉得这比那更复杂一些。
您必须自己调查一下。但请记住:
&expectedResult
) 将失效,因为它是局部变量。expectedResult
的值将变为无效,因为该地址指向将被耗尽释放的内存。expectedResult
的值做任何事情 很可能会出错,因为我不认为 Class
有资格作为“收费”免费桥接”。我怀疑,但我可能错了,您没有按照预期的方式使用 OCMock api。但在这方面我帮不了你,也许你真的做对了。
关于objective-c - 如何在 ARC 中从 id __autoreleasing * 转换为 void **?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939665/
我在返回错误的 Apple 函数中注意到了这种模式 error:(NSError *__autoreleasing *)outError 我理解它的意思,它是指向指针的指针,用于执行结果(仅使用 *
在 AFNetworking 中我找到了这个函数: - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
我有一个街区; typedef void (^SIResponseHandler) (id obj, NSString *error); 和方法: + (void)uploadPhoto:(UIIma
如何使变量的地址成为 NSObject 中的强属性?我有一个名为 SCPFMessageThreadQuery 的类,它是通过传递 SCPFMessageThread 变量的地址来分配初始化的。 @i
所以我像往常一样将一个指向 NSError 对象的指针传递给一个方法。它曾经很简单: -(BOOL)foo:(NSString *)string error:(NSError **)error 但是对
我拼命想了解 __autoreleasing 关键字在 Objective-C 中的用法。我已仔细阅读以下问题的答案: In which situations do we need to write
根据 Transitioning to ARC Release Notes : __autoreleasing is used to denote arguments that are passed
有人可以向我解释在以下示例代码块中使用 __autoreleasing 的目的吗? - (void)execute:(NSError * __autoreleasing *)error { /
我一直都知道这种模式是管理 NSError** 参数(特别是 BOOL 返回值和 NSError* __autoreleasing * 参数: -(BOOL)doSomethingWithString
我正在尝试将旧的非 ARC 项目转换为 ARC,但出现此编译错误:“无法在 block 中捕获 __autoreleasing 变量” - (void)animateViewController:(_
-(NSData *)jsonRepresentation:(NSError **error)error { NSDictionary *dict = [self getDictRepresen
考虑这段代码: @implementation MyClass -(void)dealloc { NSLog(@"MyClass dealloc: %@", self); } @end @im
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: In which situations do we need to write the __autorele
根据 Cocoa 的“创建规则”,返回新实例化对象的方法必须以 new、create 或 copy 开头,如果所有权转移给调用者。 假设我有一个实现名为 (NSObject *)getCorrectO
在学习 NSInvocations 时,我对内存管理的理解似乎存在差距。 这是一个示例项目: @interface DoNothing : NSObject @property (nonatomic,
我正在尝试完成这个谜题。 __strong 是所有 Objective-C 可保留对象指针(如 NSObject、NSString 等)的默认值。它是一个强引用。 ARC 在作用域末尾用 -relea
为什么 Apple 的方法没有将 NSError** 声明为 NSError * __autoreleasing * ? Transitioning to ARC Release Notes似乎暗示他
我正在尝试从 id __autoreleasing * 转换为 CFTypeRef * (void **)。 我试过: id __autoreleasing *arg = [OCMArg setTo:
在 ARC 下,输出参数采用以下形式(默认情况下;这等同于 NSError **): - (BOOL)tryWithError:(NSError *__autoreleasing *)err; 来自T
我正在尝试使用 PowerPlot 库绘制条形图。因此,我发现只有这个代码可以满足我对负条以及阴影或不透明度的要求。原始示例项目不使用 ARC。但是我的项目使用 ARC。在复制相同的代码时,我在编译项
我是一名优秀的程序员,十分优秀!