NSInvocation触发内存泄漏
问题描述:
我在用ARC测试NSInvocation,但它触发内存泄漏。在MRC中,它运作良好。我不知道为什么。NSInvocation触发内存泄漏
- (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);
}
答
我在stackOverflow中找到答案。问题是getReturnValue :,它只是将返回值的字节复制到给定的内存缓冲区中,而不管类型如何。如果返回类型是可保留的对象指针类型,它不知道或关心内存管理。由于ret是对象指针类型的__strong变量,因此ARC会假定已放入变量的任何值都被保留,因此会在超出范围时释放它。在这种情况下不是这样,所以它崩溃了。 (此外,由于getReturnValue:覆盖该值而不释放它,因此,原本指向ret的数组将被泄露,为什么您甚至将该变量指向某个对象首先是超出了我的范围。) NSInvocation returns value but makes app crash with EXC_BAD_ACCESS