- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个正在迭代并寻找特定标志的数组。如果标志值为 nil,我将调用一个生成调用对象并返回调用结果的方法。
我的代码结构如下
for(NSString *key in [taxiPlanes allKeys])
{
Plane *currentPlane = [taxiPlanes objectForKey:key];
if(currentPlane.currentAction == nil)
{
NSString *selector = [[currentPlane planeTakeoffSequence] firstObject];
currentPlane.currentAction = selector;
// Calling for NSInvocation in [self ...]
NSArray *action = [NSArray arrayWithArray:[self operationFromTakeoffAction:currentPlane.currentAction AtPoint:currentPlane.position]];
NSLog(@"%@",action);
}
}
生成NSInvocation的方法
-(NSArray *) operationFromTakeoffAction:(NSString *) action AtPoint:(CGPoint) flightPoint
{
NSMethodSignature *methodSignature = [FlightOperations instanceMethodSignatureForSelector:NSSelectorFromString(action)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:fOps];
[invocation setSelector:NSSelectorFromString(action)];
[invocation setArgument:&flightPoint atIndex:2];
NSArray *resultSet = [NSArray alloc]init];
[invocation invoke];
[invocation getReturnValue:&resultSet];
return resultSet;
}
在 for 循环中,没有 NSInvocation ([self ....]) 的方法调用,循环执行得很好,没有崩溃。但是当我引入调用 NSInvocation 的方法时,我能够看到 NSLog in for 循环打印预期的 NSArray 结果,但它崩溃并显示错误消息 EXC_BAD_ACCESS。
即使 NSInvocation 返回正确的结果,我也无法弄清楚为什么它会失败。没有 NSInvocation,for 循环不会崩溃。
任何建议都会有所帮助。
谢谢
最佳答案
我猜你正在使用 ARC?
问题出在 [invocation getReturnValue:&resultSet];
行。 getReturnValue:
只是将返回值的字节复制到给定的内存缓冲区中,而不考虑类型。如果返回类型是可保留的对象指针类型,它不知道也不关心内存管理。由于 resultSet
是一个对象指针类型的 __strong
变量,ARC 假设任何已经放入该变量的值都被保留,因此当它出去时将释放它的范围。在这种情况下情况并非如此,因此它崩溃了。 (此外,您让 resultSet
最初指向的数组将被泄漏,因为 getReturnValue:
会在不释放它的情况下覆盖该值。为什么您甚至使该变量指向一个对象首先超出了我的范围。)
解决方案是必须将指向非保留类型的指针提供给getReturnValue:
。要么:
NSArray * __unsafe_unretained tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = tempResultSet;
或:
void *tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = (__bridge NSArray *)tempResultSet;
关于ios - NSInvocation 返回值但使用 EXC_BAD_ACCESS 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22018272/
我正在使用 NSInvocation 调用一个我在编译时不知道的方法。 它工作正常,因为我没有找到如何传递 NSError** 类型的参数。 举个例子,假设我想从 NSFileManager 调用方法
以下代码抛出异常。 vcClass 是一个 Class 对象(继承自 UIViewController)。 Self 包含 我的实现 viewWillAppear: SEL viewWillAppea
既然可以直接调用方法,为什么还要使用 NSInvocation?需要问这个问题是因为我无法理解需要使用这个类。与仅调用如下方法相比,使用它有什么优势。 [myArray addObject:mySt
这个问题在这里已经有了答案: NSInvocation getReturnValue: called inside forwardInvocation: makes the returned obj
我想在未来安排一个函数调用。我正在使用 Swift。 我想回调一个私有(private)方法并返回一个 Promise(来自 PromiseKit) 我见过的所有例子都用到了 NSTimer.sche
什么是NSInspiration?何时以及如何使用它? 最佳答案 NSInvocation是消息发送的具体化。换句话说,它是一个代表消息发送的对象。 假设您的 Foo 类有一个名为 -[Foo foo
我创建了一个弱目标定时器类,当目标被释放时,定时器不会触发并自动失效。代码是这样的: //ViewController.m @interface TestObj : NSObject @end @im
有谁知道如何将 NSInvocation 的参数设置为 nil ?我正在尝试使用 OCMock,我希望这种期望返回 nil。问题是调用该方法时我需要做一些其他事情,正如您在示例中看到的那样,这就是为什
我有一个方法,它采用类似这样的可变参数,参数以 nil 结尾。 -(void)manyParams:(NSString *)st, ... { va_list argList; va_
我想使用一个将指向 NSError 对象的指针作为参数的方法来创建一个 NSInvocation 对象。这方面的一个例子是方法 - - (BOOL)writeToFile:(NSString *)pa
下面是我从Apple的“Timer Programming Topics”看到的示例代码: NSMethodSignature *methodSignature = [self methodSigna
我如何(或什至可以)将 nil 参数传递给 NSInvocation 对象? 我试着这样做: NSMethodSignature* signature = [AClass instanceMethod
我正在尝试在 Swift 中创建一个可重用的测试工具,子类将扩展测试工具以提供被测实例,并且可以添加它们自己的特定于子类的测试方法,如下所示: class FooTestHarness: XCTest
NSInvocation 究竟是如何工作的?有好的介绍吗? 我在理解以下代码(来自 Cocoa Programming for Mac OS X,第 3 版)的工作原理方面特别有问题,但我也能够独立于
我使用运行时特性向类中添加了一个类方法,但是NSInvocation 无法使用该方法。我的代码是这样的: id metaClass = object_getClass((id)protocolClas
我对 NSInvocation 有一个奇怪的问题。当网络操作完成时,我将它用作返回回调。让我更详细地解释一下前面的句子: 我正在使用通过 TCP 套接字工作的定制网络协议(protocol),并且我有
我认为我犯了一个根本性的错误,但我一生都看不到它。 我正在从 C++ 类(已锁定)中调用 Objective-C 对象的方法。我正在使用 NSInvocation 来防止我不得不编写数百个方法来访问这
我们有以下方法,适用于对象。它接受一个对象的方法并将结果放在 returnValueContainer 中: + (void)invokePrivateMethod:(SEL)selector ret
我收到这条消息: “(null):无法识别的选择器发送到类 0x3f52e824” 我试过的基本代码: SEL sel = @selector(applyProperties:toObject:);
我试图将 block 参数传递给 NSInvocation,但应用程序崩溃了。调用发出网络请求并调用成功或失败 block 。我认为问题在于 block 在网络请求完成之前被释放。我设法让它与一些 B
我是一名优秀的程序员,十分优秀!