ObjC: cast of an indirect pointer to an Objective-

2019-08-20 08:06发布

How can I change the following code to be compatible with ARC:

MyObj* fn = nil;
[self performSelectorOnMainThread:@selector(popSomething:) withObject:(id)&fn waitUntilDone:YES];

Right now, I get the following error:

error: cast of an indirect pointer to an Objective-C pointer to '__strong id' is disallowed with ARC [4]

2条回答
太酷不给撩
2楼-- · 2019-08-20 08:27

If you're expecting the main thread to update the string, then a better way to do it would be to use a mutable string and simply pass it to the main thread:

NSMutableString* fn = [NSMutableString string];
[self performSelectorOnMainThread:@selector(queuedFileNamesPop:) withObject:fn waitUntilDone:YES];

Then the main thread can simply update the string.

查看更多
男人必须洒脱
3楼-- · 2019-08-20 08:32

The type of the argument should be (id *), ie. a pointer to an object, not an object.

But if you just want to return a value from a method that you need to execute on the main thread, a nicer solution is to use blocks and GCD:

__block id poppedFilename;
dispatch_sync(dispatch_get_main_queue(), ^{
     poppedFilename = [self popFilename];
});
// do something with the popped file

This executes the method -popFilename on the main thread, and stores the result in poppedFilename. You must be careful not to call this method on the main thread, as it would deadlock. If you aren't sure if you are on the main thread, you could use something like this:

__block id poppedFilename;
if ([NSThread isMainThread]) {
     poppedFilename = [self popFilename];
} else {
     dispatch_sync(dispatch_get_main_queue(), ^{
         poppedFilename = [self popFilename];
     });
}
查看更多
登录 后发表回答