【问题标题】:NSInvocation trigger memory leakNSInvocation 触发内存泄漏
【发布时间】:2016-01-12 20:27:22
【问题描述】:

我在 NSInvocation 中使用 ARC 进行测试,但它触发了内存泄漏。在 MRC 中,它运行良好。我不知道为什么。

- (NSArray *)a:(NSString *)a b:(NSString *)b c:(NSString *)c
{
    return  @[a, b, c];
}
- (void)testNSInvocation
{
    NSMethodSignature *sig = [self methodSignatureForSelector:@selector(a:b:c:)];
    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];

    [inv setTarget:self];
    [inv setSelector:@selector(a:b:c:)];

    NSString *a = @"a", *b = @"b", *c = @"c";
    [inv setArgument:&a atIndex:2];
    [inv setArgument:&b atIndex:3];
    [inv setArgument:&c atIndex:4];

    [inv retainArguments];
    [inv invoke];

    NSArray *ret;
    [inv getReturnValue:&ret];//this is problem,but why?
    NSLog(@"ret:%@", ret);
} 

【问题讨论】:

    标签: ios memory-leaks


    【解决方案1】:

    我在 stackOverflow 中找到了答案。问题是 getReturnValue:,它只是将返回值的字节复制到给定的内存缓冲区中,而不管类型如何。如果返回类型是可保留的对象指针类型,它不知道也不关心内存管理。由于 ret 是对象指针类型的 __strong 变量,因此 ARC 假定已放入变量的任何值都已保留,因此在超出范围时将释放它。在这种情况下不是这样,所以它崩溃了。 (此外,最初指向 ret 的数组将被泄露,因为 getReturnValue: 会覆盖该值而不释放它。为什么您甚至首先使该变量指向一个对象,这超出了我的理解。) NSInvocation returns value but makes app crash with EXC_BAD_ACCESS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2020-08-06
      • 2013-04-10
      • 1970-01-01
      相关资源
      最近更新 更多