10.10, Xcode 6.1, using Arc.

The following code works fine, with USE_INVOCATION defined or not:

#define USE_INVOCATION  (or commented out)

- (NSSet *)doSomethingWith: (NSArray *)listOfActions  onSet: (NSSet *)originSet
{
        NSSet *inputSet = originSet;
        
        for( NSString *curSelectorName in listOfActions )
        {
                SEL theSelector = NSSelectorFromString( curSelectorName );
                
                #ifdef          USE_INVOCATION
                        NSMethodSignature *signature = [ [self class] 
instanceMethodSignatureForSelector: theSelector ];
                        NSInvocation *iv = [ NSInvocation 
invocationWithMethodSignature: signature ];
                        iv.target = self;
                        iv.selector = theSelector;
                #endif  //      USE_INVOCATION
                
                NSMutableSet *outputSet = [ NSMutableSet set ];

                for( NSDictionary *dict in inputSet )   
                {
                        #ifdef          USE_INVOCATION
                                [ iv setArgument: (void *)&dict  atIndex: 2 ];  
//      ← any bridging to be done?
                                [ iv invoke ];
                                NSDictionary *new;
                                [ iv getReturnValue: &new ];    //      ← any 
bridging to be done?
                        #else   //      use performSelector
                                NSDictionary *new = [ self performSelector: 
theSelector  withObject: dict ];
                        #endif  //      USE_INVOCATION
                                                
                        [ outputSet addObject: new ];
                };
                                
                inputSet = outputSet;
        };
        
        return inputSet;
}

Without USE_INVOCATION defined, I get some compiler warning about potential 
leaks, because selector is unknown.

But with USE_INVOCATION defined, it will crash later (when all has been done), 
obviously while cleaning an AutoreleasePool:

(lldb) bt
* thread #1: tid = 0x145595, 0x00007fff8a090acf libobjc.A.dylib`objc_release + 
15, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS 
(code=EXC_I386_GPFLT)
    frame #0: 0x00007fff8a090acf libobjc.A.dylib`objc_release + 15
    frame #1: 0x00007fff8a08f91f libobjc.A.dylib`(anonymous 
namespace)::AutoreleasePoolPage::pop(void*) + 575
    frame #2: 0x00007fff8e0301f9 CFNetwork`-[NSURLConnectionInternal 
_withConnectionAndDelegate:onlyActive:] + 240
    frame #3: 0x00007fff8e030396 CFNetwork`-[NSURLConnectionInternal 
_withConnectionAndDelegate:] + 45
    frame #4: 0x00007fff8e016acb 
CFNetwork`_NSURLConnectionDidFail(_CFURLConnection*, __CFError*, void const*) + 
95
    frame #5: 0x00007fff8dfcc64c 
CFNetwork`___ZN27URLConnectionClient_Classic17_delegate_didFailEP9__CFErrorU13block_pointerFvvE_block_invoke
 + 118
    frame #6: 0x00007fff8dfca3b3 
CFNetwork`___ZN27URLConnectionClient_Classic18_withDelegateAsyncEPKcU13block_pointerFvP16_CFURLConnectionPK33CFURLConnectionClientCurrent_VMaxE_block_invoke_2
 + 94
    frame #7: 0x00007fff8deec7cc 
CFNetwork`RunloopBlockContext::_invoke_block(void const*, void*) + 72
    frame #8: 0x00007fff8fdac1e4 CoreFoundation`CFArrayApplyFunction + 68
    frame #9: 0x00007fff8deec68d CFNetwork`RunloopBlockContext::perform() + 133
    frame #10: 0x00007fff8deec52e CFNetwork`MultiplexerSource::perform() + 282
    frame #11: 0x00007fff8deec350 CFNetwork`MultiplexerSource::_perform(void*) 
+ 72
    frame #12: 0x00007fff8fde0661 
CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    frame #13: 0x00007fff8fdd27ed CoreFoundation`__CFRunLoopDoSources0 + 269
    frame #14: 0x00007fff8fdd1e1f CoreFoundation`__CFRunLoopRun + 927
    frame #15: 0x00007fff8fdd1838 CoreFoundation`CFRunLoopRunSpecific + 296
    frame #16: 0x00007fff8e10243f HIToolbox`RunCurrentEventLoopInMode + 235
    frame #17: 0x00007fff8e1021ba HIToolbox`ReceiveNextEventCommon + 431
    frame #18: 0x00007fff8e101ffb 
HIToolbox`_BlockUntilNextEventMatchingListInModeWithFilter + 71
    frame #19: 0x00007fff8e416821 AppKit`_DPSNextEvent + 964
    frame #20: 0x00007fff8e415fd0 AppKit`-[NSApplication 
nextEventMatchingMask:untilDate:inMode:dequeue:] + 194
    frame #21: 0x00007fff8e409f73 AppKit`-[NSApplication run] + 594
    frame #22: 0x00007fff8e3f5424 AppKit`NSApplicationMain + 1832
  * frame #23: 0x0000000100001c12 Royal5`main(argc=3, argv=0x00007fff5fbff758) 
+ 34 at main.m:13
    frame #24: 0x00007fff8819e5c9 libdyld.dylib`start + 1


Seems like Arc (or I) is somehow confused.

Any help would be greatly appreciated.

Gerriet.


_______________________________________________

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