2013-01-15 102 views
0

我有一个对象,类似于UIAlertView,它显示一个带有自定义消息和标题的对话框。到目前为止,下面的代码工作,以显示该对话框:iOS - 防止对象释放

DialogBox *dialog = [[DialogBox alloc] initWithMessage:@"Hello" delegate:self]; 
[dialog showDialog]; 

当我点击无论是“YES”或“NO”对话框上的按钮,但是,应用程序崩溃,因为DialogBox实例已被释放。

使*对话框实例变量属性修复了这个问题,但这对我不起作用,因为我希望能够随机创建DialogBox实例变量。

有没有办法让* dialog对象实例变量“alive”,直到我希望它真的从视图中消失?

任何帮助将不胜感激。

Crash log below: 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x000000005f7b5e7d 

VM Regions Near 0x5f7b5e7d: 
    MALLOC_TINY   000000000ea00000-000000000eb00000 [ 1024K] rw-/rwx SM=PRV 
--> 
    __TEXT     000000008fea8000-000000008fedb000 [ 204K] r-x/rwx SM=COW /usr/lib/dyld 

Application Specific Information: 
objc_msgSend() selector name: performSelector:withObject:withObject: 
iPhone Simulator 369.2, iPhone OS 6.1 (iPhone/10B5126b) 


Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib     0x010e60b0 objc_msgSend + 36 
1 UIKit       0x0001c2c0 -[UIApplication sendAction:to:from:forEvent:] + 96 
2 UIKit       0x0001c258 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61 
3 UIKit       0x000dd021 -[UIControl sendAction:to:forEvent:] + 66 
4 UIKit       0x000dd57f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 578 
5 UIKit       0x000dc6e8 -[UIControl touchesEnded:withEvent:] + 546 
6 UIKit       0x0004bcef -[UIWindow _sendTouchesForEvent:] + 846 
7 UIKit       0x0004bf02 -[UIWindow sendEvent:] + 273 
8 UIKit       0x00029d4a -[UIApplication sendEvent:] + 436 
9 UIKit       0x0001b698 _UIApplicationHandleEvent + 9874 
10 GraphicsServices    0x01bf2df9 _PurpleEventCallback + 339 
11 GraphicsServices    0x01bf2ad0 PurpleEventCallback + 46 
12 CoreFoundation     0x01c0cbf5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53 
13 CoreFoundation     0x01c0c962 __CFRunLoopDoSource1 + 146 
14 CoreFoundation     0x01c3dbb6 __CFRunLoopRun + 2118 
15 CoreFoundation     0x01c3cf44 CFRunLoopRunSpecific + 276 
16 CoreFoundation     0x01c3ce1b CFRunLoopRunInMode + 123 
17 GraphicsServices    0x01bf17e3 GSEventRunModal + 88 
18 GraphicsServices    0x01bf1668 GSEventRun + 104 
19 UIKit       0x00018ffc UIApplicationMain + 1211 
20 DialogApp      0x0000257d main + 141 (main.m:16) 
21 DialogApp      0x000024a5 start + 53 

Thread 1: 
0 libsystem_kernel.dylib   0x998580ee __workq_kernreturn + 10 
1 libsystem_c.dylib    0x9214904c _pthread_workq_return + 45 
2 libsystem_c.dylib    0x92148e19 _pthread_wqthread + 448 
3 libsystem_c.dylib    0x92130cca start_wqthread + 30 

Thread 2:: Dispatch queue: com.apple.libdispatch-manager 
0 libsystem_kernel.dylib   0x998589ca kevent64 + 10 
1 libdispatch.dylib    0x049fec2b _dispatch_mgr_invoke + 863 
2 libdispatch.dylib    0x049fe8cc _dispatch_mgr_thread + 61 

Thread 3: 
0 libsystem_kernel.dylib   0x998580ee __workq_kernreturn + 10 
1 libsystem_c.dylib    0x9214904c _pthread_workq_return + 45 
2 libsystem_c.dylib    0x92148e19 _pthread_wqthread + 448 
3 libsystem_c.dylib    0x92130cca start_wqthread + 30 

Thread 4: 
0 libsystem_kernel.dylib   0x998580ee __workq_kernreturn + 10 
1 libsystem_c.dylib    0x9214904c _pthread_workq_return + 45 
2 libsystem_c.dylib    0x92148e19 _pthread_wqthread + 448 
3 libsystem_c.dylib    0x92130cca start_wqthread + 30 

Thread 5:: WebThread 
0 libsystem_kernel.dylib   0x998557d2 mach_msg_trap + 10 
1 libsystem_kernel.dylib   0x99854cb0 mach_msg + 68 
2 CoreFoundation     0x01c38a49 __CFRunLoopServiceMachPort + 185 
3 CoreFoundation     0x01c3d8d4 __CFRunLoopRun + 1380 
4 CoreFoundation     0x01c3cf44 CFRunLoopRunSpecific + 276 
5 CoreFoundation     0x01c3ce1b CFRunLoopRunInMode + 123 
6 WebCore       0x0356dc50 RunWebThread(void*) + 608 
7 libsystem_c.dylib    0x92146557 _pthread_start + 344 
8 libsystem_c.dylib    0x92130cee thread_start + 34 

Thread 0 crashed with X86 Thread State (32-bit): 
    eax: 0x5f7b5e7d ebx: 0x0001c26e ecx: 0x00cb6b07 edx: 0x00005240 
    edi: 0x012cfd4f esi: 0x694c534e ebp: 0xbfffe108 esp: 0xbfffe0d4 
    ss: 0x00000023 efl: 0x00010206 eip: 0x010e60b0 cs: 0x0000001b 
    ds: 0x00000023 es: 0x00000023 fs: 0x00000000 gs: 0x0000000f 
    cr2: 0x5f7b5e7d 
Logical CPU: 1 
+0

崩溃发生在哪里?在委托方法中? –

+0

这些按钮具有指向DialogBox类中方法的选择器,并且由于对象已被释放,因此在调用这些方法时看起来有错误。 – achiral

+1

你可以把崩溃日志? –

回答

2

这是您想保留对self的引用以防止释放的情况之一(相对较少)。这会让你的对话框“火并且忘记”,而不会被释放。

在你DialogBox类,添加属性(它应该是一个私人的),您可以存储一个参考。我们称之为selfProperty

然后,当您初始化您的班级时,请使用self.selfProperty = self;,并在您想要释放时将其设置为零。

+0

感谢您的回复。我添加了一个'@property(nonatomic,strong)id selfProperty'属性,当我初始化DialogBox时,我将其设置为'self',但是当我选择其中一个对话框按钮时,仍会出现取消分配错误。 – achiral

+0

@lnafziger为什么一个财产,而不是一个伊娃? – Richard

+0

@achiral:你确定你的初始化函数被调用了吗?设置一个断点并确保。 – lnafziger