> On 27 Jul 2016, at 12:05 PM, Trygve Inda <cocoa...@xericdesign.com> wrote:
> 
> How is it retained by the main thread without an explicit retain call?
> 
> I would be no different than a main thread calling:
> 
> someVar [[MyObj alloc] init]
> [someVar doSomething];
> 
> If a worker thread were able to call [someVar release] between these two
> lines, the doSomething call could fail.


The atomic setter method probably looks something like this:

- (void)        setImageRep:(NSImageRep*) rep
{
        @synchronized( self )
        {
                [rep retain];
                [_imageRep autorelease];
                _imageRep = rep;
        }
}

i.e. the old value is autoreleased. Which thread’s pool gets that autorelease 
is a matter for consideration though. I have no idea if it’s just left to the 
caller’s pool, or if there are steps taken to ensure it ends up in the main 
pool. Even if it’s the caller’s pool, unless you’re draining it on each loop, 
it may only ever get drained when the thread ends, which is safe. But it could 
accumulate a lot of unreleased memory which is another potential problem.

Threads are tricky ;)

—Graham



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to