Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@orta => Tries to fix #103 and various related tickets. #203

Merged
merged 1 commit into from
Feb 19, 2015

Conversation

alloy
Copy link
Contributor

@alloy alloy commented Feb 19, 2015

Also does the weak->strong dance in the right order.

As discussed I will be doing a bit more investigating, but I think what's happening is:

  • ARArtworkView (a UIScrollView subclass) is being retained longer than its VC (ARArtworkViewController).
  • UIScrollView's delegate property is assign not weak.
  • The UIScrollView implementation tries to message its delegate when it has already been released.

Also does the weak->strong dance in the right order.
orta added a commit that referenced this pull request Feb 19, 2015
@orta => Tries to fix #103 and various related tickets.
@orta orta merged commit fc148a2 into master Feb 19, 2015
@orta
Copy link
Contributor

orta commented Feb 19, 2015

🎱

@alloy
Copy link
Contributor Author

alloy commented Feb 20, 2015

For completeness sake, here is a session of where I try to simulate the crash, as I haven’t been able to reproduce it.

void * -[UIScrollView _getDelegateZoomView](void * self, void * _cmd) {
    r14 = self;
    rbx = r14->_zoomView;
    if (rbx == 0x0) {
            rax = [r14->_delegate respondsToSelector:@selector(viewForZoomingInScrollView:)];
            LODWORD(rbx) = 0x0;
            if (LOBYTE(rax) != 0x0) {
                    rbx = [r14->_delegate viewForZoomingInScrollView:r14];
                    LODWORD(rax) = *(int32_t *)__UIApplicationLinkedOnVersion;
                    if (LODWORD(rax) != 0x0) {
                            LODWORD(rax) = *(int32_t *)__UIApplicationLinkedOnVersion;
                            LOBYTE(rax) = LODWORD(rax) > 0x4ffff ? 0x1 : 0x0;
                    }
                    else {
                            rax = ___UIApplicationLinkedOnOrAfter(0x50000);
                    }
                    if ((LOBYTE(rax) != 0x0) && (rbx == r14)) {
                            rdx = **NSGenericException;
                            [NSException raise:rdx format:@"The view returned from viewForZoomingInScrollView: must be a subview of the scroll view. It can not be the scroll view itself."];
                    }
            }
    }
    rax = rbx;
    return rax;
}
~/C/A/eigen [HEAD] » lldb -p (pgrep '^Artsy$')
(lldb) process attach --pid 74926
Process 74926 stopped
Executable module set to "/Users/eloy/Library/Developer/CoreSimulator/Devices/FC73FE27-B28B-459D-9878-BD20C838E3C9/data/Containers/Bundle/Application/E372B5E0-281A-4439-A657-476D02245059/Artsy.app/Artsy".
Architecture set to: x86_64-apple-ios.

(lldb) b -[ARArtworkView setUpCallbacks]
Breakpoint 1: where = Artsy`-[ARArtworkView setUpCallbacks] + 19 at ARArtworkView.m:101, address = 0x000000010e722853

(lldb) continue
Process 74926 resuming
Process 74926 stopped
* thread #1: tid = 0x1b5faf, 0x000000010e722853 Artsy`-[ARArtworkView setUpCallbacks](self=0x00007fc99c95b230, _cmd=0x000000010eb60e58) + 19 at ARArtworkView.m:101, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x000000010e722853 Artsy`-[ARArtworkView setUpCallbacks](self=0x00007fc99c95b230, _cmd=0x000000010eb60e58) + 19 at ARArtworkView.m:101
   98   - (void)setUpCallbacks
   99   {
   100  
-> 101      @weakify(self);
   102  
   103      void (^completion)(void) = ^{
   104          @strongify(self);

(lldb) b -[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:]
Breakpoint 2: where = UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:], address = 0x00000001105c1fb7

(lldb) continue
Process 74926 resuming
Process 74926 stopped
* thread #1: tid = 0x1b5faf, 0x00000001105c1fb7 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:], queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
    frame #0: 0x00000001105c1fb7 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:]
UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:]:
-> 0x1105c1fb7:  pushq  %rbp
   0x1105c1fb8:  movq   %rsp, %rbp
   0x1105c1fbb:  pushq  %rbx
   0x1105c1fbc:  subq   $0x68, %rsp

(lldb) bt
* thread #1: tid = 0x1b5faf, 0x00000001105c1fb7 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:], queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
  * frame #0: 0x00000001105c1fb7 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:]
    frame #1: 0x0000000110bba143 UIKit`-[UIView(AdditionalLayoutSupport) _nsis_center:bounds:inEngine:] + 1566
    frame #2: 0x000000011059ec35 UIKit`-[UIView(Geometry) _applyISEngineLayoutValues] + 136
    frame #3: 0x000000011059f01e UIKit`-[UIView(Geometry) _resizeWithOldSuperviewSize:] + 150
    frame #4: 0x00000001105a27fa UIKit`-[UIView(Hierarchy) layoutBelowIfNeeded] + 534
    frame #5: 0x000000010e7c5a26 Artsy`-[ARArtworkViewController artworkMetadataView:didUpdateArtworkDetailView:](self=0x00007fc99c9681d0, _cmd=0x000000010eb6253e, metadataView=0x00007fc99c94c7e0, detailView=0x00007fc99a732480) + 246 at ARArtworkViewController.m:188
    frame #6: 0x000000010e737f4d Artsy`-[ARArtworkMetadataView didUpdateArtworkDetailView:](self=0x00007fc99c94c7e0, _cmd=0x000000010eb6259d, detailView=0x00007fc99a732480) + 93 at ARArtworkMetadataView.m:125
    frame #7: 0x000000010e779516 Artsy`-[ARArtworkDetailView updateWithArtwork:](self=0x00007fc99a732480, _cmd=0x000000010eb56e71, artwork=0x00007fc99c8da670) + 4646 at ARArtworkDetailView.m:220
    frame #8: 0x000000010e7778be Artsy`__35-[ARArtworkDetailView setDelegate:]_block_invoke(.block_descriptor=<unavailable>) + 110 at ARArtworkDetailView.m:42
    frame #9: 0x000000010e6e3643 Artsy`__35-[Artwork onArtworkUpdate:failure:]_block_invoke(.block_descriptor=<unavailable>, value=0x00007fc99c8da670) + 83 at Artwork.m:281
    frame #10: 0x000000010e9ff603 Artsy`-[KSPromise resolveWithValue:](self=0x00007fc99a70ec80, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 707 at KSPromise.m:151
    frame #11: 0x000000010e9fd749 Artsy`-[KSDeferred resolveWithValue:](self=0x00007fc99a73c590, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 89 at KSDeferred.m:25
    frame #12: 0x000000010e6e2e36 Artsy`__24-[Artwork updateArtwork]_block_invoke(.block_descriptor=0x00007fc99c963d30, artwork=0x00007fc99c942d20) + 166 at Artwork.m:257
    frame #13: 0x000000010e6dd564 Artsy`__63+[ArtsyAPI getRequest:parseIntoAClass:withKey:success:failure:]_block_invoke_2(.block_descriptor=<unavailable>) + 36 at ArtsyAPI.m:50
    frame #14: 0x00000001130a3af6 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #15: 0x00000001130bdaf4 libdispatch.dylib`_dispatch_client_callout + 8
    frame #16: 0x00000001130a9265 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 490
    frame #17: 0x0000000112297fe9 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    frame #18: 0x000000011225aeeb CoreFoundation`__CFRunLoopRun + 2043
    frame #19: 0x000000011225a486 CoreFoundation`CFRunLoopRunSpecific + 470
    frame #20: 0x00000001148a39f0 GraphicsServices`GSEventRunModal + 161
    frame #21: 0x0000000110535420 UIKit`UIApplicationMain + 1282
    frame #22: 0x000000010e6abd17 Artsy`main(argc=1, argv=0x00007fff5155c948) + 151 at main.m:7
    frame #23: 0x00000001130ed145 libdyld.dylib`start + 1

(lldb) b -[UIScrollView _getDelegateZoomView]
Breakpoint 3: where = UIKit`-[UIScrollView _getDelegateZoomView], address = 0x00000001105bf8cd

(lldb) continue
Process 74926 resuming
Process 74926 stopped
* thread #1: tid = 0x1b5faf, 0x00000001105bf8cd UIKit`-[UIScrollView _getDelegateZoomView], queue = 'com.apple.main-thread', stop reason = breakpoint 3.1
    frame #0: 0x00000001105bf8cd UIKit`-[UIScrollView _getDelegateZoomView]
UIKit`-[UIScrollView _getDelegateZoomView]:
-> 0x1105bf8cd:  pushq  %rbp
   0x1105bf8ce:  movq   %rsp, %rbp
   0x1105bf8d1:  pushq  %r15
   0x1105bf8d3:  pushq  %r14

(lldb) bt
* thread #1: tid = 0x1b5faf, 0x00000001105bf8cd UIKit`-[UIScrollView _getDelegateZoomView], queue = 'com.apple.main-thread', stop reason = breakpoint 3.1
  * frame #0: 0x00000001105bf8cd UIKit`-[UIScrollView _getDelegateZoomView]
    frame #1: 0x00000001105c1fe9 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:] + 50
    frame #2: 0x0000000110bba143 UIKit`-[UIView(AdditionalLayoutSupport) _nsis_center:bounds:inEngine:] + 1566
    frame #3: 0x000000011059ec35 UIKit`-[UIView(Geometry) _applyISEngineLayoutValues] + 136
    frame #4: 0x000000011059f01e UIKit`-[UIView(Geometry) _resizeWithOldSuperviewSize:] + 150
    frame #5: 0x00000001105a27fa UIKit`-[UIView(Hierarchy) layoutBelowIfNeeded] + 534
    frame #6: 0x000000010e7c5a26 Artsy`-[ARArtworkViewController artworkMetadataView:didUpdateArtworkDetailView:](self=0x00007fc99c9681d0, _cmd=0x000000010eb6253e, metadataView=0x00007fc99c94c7e0, detailView=0x00007fc99a732480) + 246 at ARArtworkViewController.m:188
    frame #7: 0x000000010e737f4d Artsy`-[ARArtworkMetadataView didUpdateArtworkDetailView:](self=0x00007fc99c94c7e0, _cmd=0x000000010eb6259d, detailView=0x00007fc99a732480) + 93 at ARArtworkMetadataView.m:125
    frame #8: 0x000000010e779516 Artsy`-[ARArtworkDetailView updateWithArtwork:](self=0x00007fc99a732480, _cmd=0x000000010eb56e71, artwork=0x00007fc99c8da670) + 4646 at ARArtworkDetailView.m:220
    frame #9: 0x000000010e7778be Artsy`__35-[ARArtworkDetailView setDelegate:]_block_invoke(.block_descriptor=<unavailable>) + 110 at ARArtworkDetailView.m:42
    frame #10: 0x000000010e6e3643 Artsy`__35-[Artwork onArtworkUpdate:failure:]_block_invoke(.block_descriptor=<unavailable>, value=0x00007fc99c8da670) + 83 at Artwork.m:281
    frame #11: 0x000000010e9ff603 Artsy`-[KSPromise resolveWithValue:](self=0x00007fc99a70ec80, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 707 at KSPromise.m:151
    frame #12: 0x000000010e9fd749 Artsy`-[KSDeferred resolveWithValue:](self=0x00007fc99a73c590, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 89 at KSDeferred.m:25
    frame #13: 0x000000010e6e2e36 Artsy`__24-[Artwork updateArtwork]_block_invoke(.block_descriptor=0x00007fc99c963d30, artwork=0x00007fc99c942d20) + 166 at Artwork.m:257
    frame #14: 0x000000010e6dd564 Artsy`__63+[ArtsyAPI getRequest:parseIntoAClass:withKey:success:failure:]_block_invoke_2(.block_descriptor=<unavailable>) + 36 at ArtsyAPI.m:50
    frame #15: 0x00000001130a3af6 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #16: 0x00000001130bdaf4 libdispatch.dylib`_dispatch_client_callout + 8
    frame #17: 0x00000001130a9265 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 490
    frame #18: 0x0000000112297fe9 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    frame #19: 0x000000011225aeeb CoreFoundation`__CFRunLoopRun + 2043
    frame #20: 0x000000011225a486 CoreFoundation`CFRunLoopRunSpecific + 470
    frame #21: 0x00000001148a39f0 GraphicsServices`GSEventRunModal + 161
    frame #22: 0x0000000110535420 UIKit`UIApplicationMain + 1282
    frame #23: 0x000000010e6abd17 Artsy`main(argc=1, argv=0x00007fff5155c948) + 151 at main.m:7
    frame #24: 0x00000001130ed145 libdyld.dylib`start + 1

(lldb) disassemble --frame
UIKit`-[UIScrollView _getDelegateZoomView]:
-> 0x1105bf8cd:  pushq  %rbp
   0x1105bf8ce:  movq   %rsp, %rbp
   0x1105bf8d1:  pushq  %r15
   0x1105bf8d3:  pushq  %r14
   0x1105bf8d5:  pushq  %rbx
   0x1105bf8d6:  pushq  %rax
   0x1105bf8d7:  movq   %rdi, %r14
   0x1105bf8da:  movq   0xd344ef(%rip), %rax      ; UIScrollView._zoomView
   0x1105bf8e1:  movq   (%r14,%rax), %rbx
   0x1105bf8e5:  testq  %rbx, %rbx
   0x1105bf8e8:  jne    0x1105bf97b               ; -[UIScrollView _getDelegateZoomView] + 174
   0x1105bf8ee:  movq   0xd344c3(%rip), %r15      ; UIScrollView._delegate
   0x1105bf8f5:  movq   (%r14,%r15), %rdi
   0x1105bf8f9:  movq   0xd08228(%rip), %rdx      ; "viewForZoomingInScrollView:"
   0x1105bf900:  movq   0xd02df9(%rip), %rsi      ; "respondsToSelector:"
   0x1105bf907:  callq  *0xac2783(%rip)           ; (void *)0x0000000111fe1000: objc_msgSend
   0x1105bf90d:  xorl   %ebx, %ebx
   0x1105bf90f:  testb  %al, %al
   0x1105bf911:  je     0x1105bf97b               ; -[UIScrollView _getDelegateZoomView] + 174
   0x1105bf913:  movq   (%r14,%r15), %rdi
   0x1105bf917:  movq   0xd0820a(%rip), %rsi      ; "viewForZoomingInScrollView:"
   0x1105bf91e:  movq   %r14, %rdx
   0x1105bf921:  callq  *0xac2769(%rip)           ; (void *)0x0000000111fe1000: objc_msgSend
   0x1105bf927:  movq   %rax, %rbx
   0x1105bf92a:  leaq   0xd6bcdb(%rip), %rax      ; _UIApplicationLinkedOnVersion
   0x1105bf931:  movl   (%rax), %eax
   0x1105bf933:  testl  %eax, %eax
   0x1105bf935:  je     0x1105bf941               ; -[UIScrollView _getDelegateZoomView] + 116
   0x1105bf937:  cmpl   $0x4ffff, %eax
   0x1105bf93c:  seta   %al
   0x1105bf93f:  jmp    0x1105bf94b               ; -[UIScrollView _getDelegateZoomView] + 126
   0x1105bf941:  movl   $0x50000, %edi
   0x1105bf946:  callq  0x11053641f               ; _UIApplicationLinkedOnOrAfter
   0x1105bf94b:  testb  %al, %al
   0x1105bf94d:  je     0x1105bf97b               ; -[UIScrollView _getDelegateZoomView] + 174
   0x1105bf94f:  cmpq   %r14, %rbx
   0x1105bf952:  jne    0x1105bf97b               ; -[UIScrollView _getDelegateZoomView] + 174
   0x1105bf954:  movq   0xd2e5ad(%rip), %rdi      ; (void *)0x00000001125d7458: NSException
   0x1105bf95b:  movq   0xac1866(%rip), %rax      ; (void *)0x000000011259fa10: NSGenericException
   0x1105bf962:  movq   (%rax), %rdx
   0x1105bf965:  movq   0xd0487c(%rip), %rsi      ; "raise:format:"
   0x1105bf96c:  leaq   0xb06a3d(%rip), %rcx      ; @"The view returned from viewForZoomingInScrollView: must be a subview of the scroll view. It can not be the scroll view itself."
   0x1105bf973:  xorl   %eax, %eax
   0x1105bf975:  callq  *0xac2715(%rip)           ; (void *)0x0000000111fe1000: objc_msgSend
   0x1105bf97b:  movq   %rbx, %rax
   0x1105bf97e:  addq   $0x8, %rsp
   0x1105bf982:  popq   %rbx
   0x1105bf983:  popq   %r14
   0x1105bf985:  popq   %r15
   0x1105bf987:  popq   %rbp
   0x1105bf988:  retq   

(lldb) step --count 13
Process 74926 stopped
* thread #1: tid = 0x1b5faf, 0x00000001105bf8f9 UIKit`-[UIScrollView _getDelegateZoomView] + 44, queue = 'com.apple.main-thread', stop reason = instruction step into
    frame #0: 0x00000001105bf8f9 UIKit`-[UIScrollView _getDelegateZoomView] + 44
UIKit`-[UIScrollView _getDelegateZoomView] + 44:
   0x1105bf8f5:  movq   (%r14,%r15), %rdi
-> 0x1105bf8f9:  movq   0xd08228(%rip), %rdx      ; "viewForZoomingInScrollView:"
   0x1105bf900:  movq   0xd02df9(%rip), %rsi      ; "respondsToSelector:"
   0x1105bf907:  callq  *0xac2783(%rip)           ; (void *)0x0000000111fe1000: objc_msgSend
   0x1105bf90d:  xorl   %ebx, %ebx

(lldb) po $rdi
<ARArtworkViewController: 0x7fc99c9681d0>

(lldb) register write rdi 0x10

(lldb) continue
Process 74926 resuming
Process 74926 stopped
* thread #1: tid = 0x1b5faf, 0x0000000111fe1005 libobjc.A.dylib`objc_msgSend + 5, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10)
    frame #0: 0x0000000111fe1005 libobjc.A.dylib`objc_msgSend + 5
libobjc.A.dylib`objc_msgSend + 5:
-> 0x111fe1005:  movq   (%rdi), %r11
   0x111fe1008:  movq   %rsi, %r10
   0x111fe100b:  andl   0x18(%r11), %r10d
   0x111fe100f:  shlq   $0x4, %r10

(lldb) bt
* thread #1: tid = 0x1b5faf, 0x0000000111fe1005 libobjc.A.dylib`objc_msgSend + 5, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10)
  * frame #0: 0x0000000111fe1005 libobjc.A.dylib`objc_msgSend + 5
    frame #1: 0x00000001105bf90d UIKit`-[UIScrollView _getDelegateZoomView] + 64
    frame #2: 0x00000001105c1fe9 UIKit`-[UIScrollView _offsetForCenterOfPossibleZoomView:withIncomingBoundsSize:] + 50
    frame #3: 0x0000000110bba143 UIKit`-[UIView(AdditionalLayoutSupport) _nsis_center:bounds:inEngine:] + 1566
    frame #4: 0x000000011059ec35 UIKit`-[UIView(Geometry) _applyISEngineLayoutValues] + 136
    frame #5: 0x000000011059f01e UIKit`-[UIView(Geometry) _resizeWithOldSuperviewSize:] + 150
    frame #6: 0x00000001105a27fa UIKit`-[UIView(Hierarchy) layoutBelowIfNeeded] + 534
    frame #7: 0x000000010e7c5a26 Artsy`-[ARArtworkViewController artworkMetadataView:didUpdateArtworkDetailView:](self=0x00007fc99c9681d0, _cmd=0x000000010eb6253e, metadataView=0x00007fc99c94c7e0, detailView=0x00007fc99a732480) + 246 at ARArtworkViewController.m:188
    frame #8: 0x000000010e737f4d Artsy`-[ARArtworkMetadataView didUpdateArtworkDetailView:](self=0x00007fc99c94c7e0, _cmd=0x000000010eb6259d, detailView=0x00007fc99a732480) + 93 at ARArtworkMetadataView.m:125
    frame #9: 0x000000010e779516 Artsy`-[ARArtworkDetailView updateWithArtwork:](self=0x00007fc99a732480, _cmd=0x000000010eb56e71, artwork=0x00007fc99c8da670) + 4646 at ARArtworkDetailView.m:220
    frame #10: 0x000000010e7778be Artsy`__35-[ARArtworkDetailView setDelegate:]_block_invoke(.block_descriptor=<unavailable>) + 110 at ARArtworkDetailView.m:42
    frame #11: 0x000000010e6e3643 Artsy`__35-[Artwork onArtworkUpdate:failure:]_block_invoke(.block_descriptor=<unavailable>, value=0x00007fc99c8da670) + 83 at Artwork.m:281
    frame #12: 0x000000010e9ff603 Artsy`-[KSPromise resolveWithValue:](self=0x00007fc99a70ec80, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 707 at KSPromise.m:151
    frame #13: 0x000000010e9fd749 Artsy`-[KSDeferred resolveWithValue:](self=0x00007fc99a73c590, _cmd=0x000000010eb5c5bf, value=0x00007fc99c8da670) + 89 at KSDeferred.m:25
    frame #14: 0x000000010e6e2e36 Artsy`__24-[Artwork updateArtwork]_block_invoke(.block_descriptor=0x00007fc99c963d30, artwork=0x00007fc99c942d20) + 166 at Artwork.m:257
    frame #15: 0x000000010e6dd564 Artsy`__63+[ArtsyAPI getRequest:parseIntoAClass:withKey:success:failure:]_block_invoke_2(.block_descriptor=<unavailable>) + 36 at ArtsyAPI.m:50
    frame #16: 0x00000001130a3af6 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #17: 0x00000001130bdaf4 libdispatch.dylib`_dispatch_client_callout + 8
    frame #18: 0x00000001130a9265 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 490
    frame #19: 0x0000000112297fe9 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    frame #20: 0x000000011225aeeb CoreFoundation`__CFRunLoopRun + 2043
    frame #21: 0x000000011225a486 CoreFoundation`CFRunLoopRunSpecific + 470
    frame #22: 0x00000001148a39f0 GraphicsServices`GSEventRunModal + 161
    frame #23: 0x0000000110535420 UIKit`UIApplicationMain + 1282
    frame #24: 0x000000010e6abd17 Artsy`main(argc=1, argv=0x00007fff5155c948) + 151 at main.m:7
    frame #25: 0x00000001130ed145 libdyld.dylib`start + 1

@orta
Copy link
Contributor

orta commented Feb 20, 2015

Alloy, you're mind blowing.
Can you turn this into a blog post please? I have no idea what is going on in that gist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants