2015-10-14 218 views
0

我在用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); 
} 

回答

0

我在stackOverflow中找到答案。問題是getReturnValue :,它只是將返回值的字節複製到給定的內存緩衝區中,而不管類型如何。如果返回類型是可保留的對象指針類型,它不知道或關心內存管理。由於ret是對象指針類型的__strong變量,因此ARC會假定已放入變量的任何值都被保留,因此會在超出範圍時釋放它。在這種情況下不是這樣,所以它崩潰了。 (此外,由於getReturnValue:覆蓋該值而不釋放它,因此,原本指向ret的數組將被泄露,爲什麼您甚至將該變量指向某個對象首先是超出了我的範圍。) NSInvocation returns value but makes app crash with EXC_BAD_ACCESS