Ios NSInvocation触发器内存泄漏

Ios NSInvocation触发器内存泄漏,ios,memory-leaks,Ios,Memory Leaks,我在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中使用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);
} 

我在书中找到了答案。问题是getReturnValue:,它只是将返回值的字节复制到给定的内存缓冲区中,而不考虑类型。如果返回类型是可保留的对象指针类型,它不知道也不关心内存管理。由于ret是一个对象指针类型的u_强变量,ARC假定已放入变量的任何值都已被保留,因此当它超出范围时将释放它。在本例中,情况并非如此,因此它会崩溃。另外,ret最初指向的数组将被泄漏,因为getReturnValue:将覆盖该值而不释放该值。你为什么一开始就把那个变量指向一个物体,我不明白。