Xcode 4.5.1, ARC enabled.
I've this C++ member function, for a testing environment (gtest):
NSDictionary* fetchUser(NSNumber* ID, NSError** error)
{
id user = nil;
//@autoreleasepool // crashes when @autoreleasepool is enabled
{
id data = ...; // response body of a HTTP Response (NSData) or NSError
object, never nil.
if ([data isKindOfClass:[NSData class]]) {
user = [NSJSONSerialization JSONObjectWithData:data
options:0
error:error];
}
else if (error) {
*error = data;
}
} // autoreleasepool
return user;
}
The problem here is, if the autorelease pool is **enabled**, I get a crash in
the caller's code:
NSError* err = nil;
NSDictionary* deletedUser = this->fetchUser(userID, &err);
EXPECT_TRUE(deletedUser == nil); <== the crash occurs **before**
this statement, but **after** the return statement of the function fetch user.
The debugger does not show a stack frame to confirm this, though.
libobjc.A.dylib`objc_msgSend:
0x7fff86b2fe80: testq %rdi, %rdi
0x7fff86b2fe83: je 0x7fff86b2feb0 ; objc_msgSend + 48
0x7fff86b2fe85: testb $1, %dil
0x7fff86b2fe89: jne 0x7fff86b2fec7 ; objc_msgSend + 71
0x7fff86b2fe8c: movq (%rdi), %r11
0x7fff86b2fe8f: pushq %rax
==> 0x7fff86b2fe90: movq 16(%r11), %r10 // Thread 1:
EXC_BAD_ACCESS (code=13, address=0x0)
0x7fff86b2fe94: movl %esi, %eax
0x7fff86b2fe96: andl (%r10), %eax
0x7fff86b2fe99: movq 16(%r10,%rax,8), %r11
0x7fff86b2fe9e: incl %eax
0x7fff86b2fea0: testq %r11, %r11
0x7fff86b2fea3: je 0x7fff86b2fedb ; objc_msgSend + 91
...
There is no stack frame.
This has something to do with the error parameter. If I pass nil for the error
parameter, the crash does not occur anymore.
Any hints?
Thanks in advance!
Andreas
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]