尽管通过alloc函数创建,iOS UIActivityIndi​​catorView仍然是自动释放的

时间:2014-10-14 14:20:17

标签: ios xcode uiactivityindicatorview

希望有人能给我一些关于这里发生了什么的想法,因为我完全被难倒了。

我有一个全屏黑色背景UIView,其中包含一个UIActivityIndi​​catorView。

活动视图由以下人员创建:

mySpinner = [[iosSpinner alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

其中iosSpinner是UIActivityIndi​​catorView的派生类,mySpinner是

@property (strong, nonatomic, readwrite) UIView* myview; // note the UIView rather than a UIActivityIndicatorView pointer which shouldn't matter it's a base class pointer.

通过在适当的时间将mySpinner指针设置为nil来取消分配活动视图。这是由我的代码为每种视图类型手动处理,并且适用于所有视图类型。

问题在于即使使用NARC函数(new,alloc,retain,copy)创建对象,因此应该在我的控制之下,系统偶尔决定自己释放它在我已经删除它之后,产生以下崩溃/回溯:

thread #1: tid = 0x7a76a, 0x2a3cd1a4 CoreFoundation`___forwarding___ + 532, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe)
  * frame #0: 0x2a3cd1a4 CoreFoundation`___forwarding___ + 532
    frame #1: 0x2a2fed68 CoreFoundation`_CF_forwarding_prep_0 + 24
    frame #2: 0x2d899084 UIKit`-[UIActivityIndicatorView _tearDownAnimation] + 36
    frame #3: 0x2d899018 UIKit`-[UIActivityIndicatorView stopAnimating] + 24
    frame #4: 0x0061e312 -[iosSpinner stopAnimating](self=0x1e9aaca0, _cmd=0x2e013866) + 62 at iosSpinner.mm:40
    frame #5: 0x2d89a6f8 UIKit`-[UIActivityIndicatorView dealloc] + 72
    frame #6: 0x2a2cfa90 CoreFoundation`CFRelease + 596
    frame #7: 0x2a2e7f70 CoreFoundation`-[__NSArrayM dealloc] + 148
    frame #8: 0x37e56d56 libobjc.A.dylib`objc_object::sidetable_release(bool) + 166
    frame #9: 0x37e571a8 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 404
    frame #10: 0x2a2dbb38 CoreFoundation`_CFAutoreleasePoolPop + 16
    frame #11: 0x2d83d860 UIKit`_wrapRunLoopWithAutoreleasePoolHandler + 60
    frame #12: 0x2a390844 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
    frame #13: 0x2a38df28 CoreFoundation`__CFRunLoopDoObservers + 276
    frame #14: 0x2a38e32a CoreFoundation`__CFRunLoopRun + 914
    frame #15: 0x2a2dbdb0 CoreFoundation`CFRunLoopRunSpecific + 476
    frame #16: 0x2a2dbbc2 CoreFoundation`CFRunLoopRunInMode + 106
    frame #17: 0x3163d050 GraphicsServices`GSEventRunModal + 136
    frame #18: 0x2d8a6f00 UIKit`UIApplicationMain + 1440

如您所见,它已被添加到自动释放池中。

这似乎是在用户垃圾邮件点击包含UIActivityIndi​​catorView的全屏视图时启用的(用户交互已启用,但由于它只是加载屏幕而没有对其收到的任何内容执行任何操作) - 它是100%可重现,但如果用户没有垃圾邮件,它可以正常工作并通过我自己的指针设置正确删除为零。

那么,在为手动控制创建UIActivityIndi​​catorView时,是否会出现这种情况?有没有办法判断它是否在系统控制之下,它是如何实现的?还有其他可能有帮助的东西吗?

干杯。

0 个答案:

没有答案