The problem is the extra dereference: you are passing a pointer to
NSString*, which is itself a pointer.
You can fix this either by adding an extra dereference in
NSString* value = *((__unsafe_unretained NSString
or by passing
testString instead of
&testString in the caller.
Neither of these solutions is ideal, because it forces a cast. Generally
void* should be reserved for calls to C functions.
When calling Objective-C to Objective-C, you could use the
type instead, which tells the compiler that you are passing an Objective-C
NSString *val = *((__unsafe_unretained NSString **)(ptr));
NSString *str = @"Hello";