Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-防止对象解除分配_Ios_Objective C_Object_Memory Management - Fatal编程技术网

iOS-防止对象解除分配

iOS-防止对象解除分配,ios,objective-c,object,memory-management,Ios,Objective C,Object,Memory Management,我有一个类似于UIAlertView的对象,它显示一个带有自定义消息和标题的对话框。到目前为止,以下代码用于显示该对话框: DialogBox *dialog = [[DialogBox alloc] initWithMessage:@"Hello" delegate:self]; [dialog showDialog]; 但是,当我点击对话框上的“是”或“否”按钮时,应用程序崩溃,因为对话框实例已被释放 将*dialog实例变量设置为属性可以解决此问题,但这对我来说不起作用,因为我希望能够随

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

DialogBox *dialog = [[DialogBox alloc] initWithMessage:@"Hello" delegate:self];
[dialog showDialog];
但是,当我点击对话框上的“是”或“否”按钮时,应用程序崩溃,因为
对话框
实例已被释放

将*dialog实例变量设置为属性可以解决此问题,但这对我来说不起作用,因为我希望能够随机创建
DialogBox
实例变量

有没有办法让*dialog实例变量保持“活动”状态,直到我希望它从视图中实际消失

任何帮助都将不胜感激

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
这是一种(相对罕见的)情况,您希望保留对
self
的引用以防止解除分配。这将使您的对话框“开火并忘记”,而不会被释放

对话框
类中,添加一个strong属性(它应该是一个私有属性),您可以在其中存储引用。让我们称之为
selfProperty


然后,在初始化类时,使用
self.selfProperty=self并在您想要解除分配时将其设置为零。

崩溃发生在哪里?在委托方法中?按钮具有指向DialogBox类中方法的选择器,调用这些方法时,似乎会出现错误,因为对象已被解除分配。能否放入崩溃日志?请尝试在.h中声明对话框,然后在viewDidLoad中声明alloc init,然后根据需要在任何地方使用。感谢您的回复。我添加了一个
@property(非原子,强)id selfProperty
属性,我在初始化对话框时将其设置为
self
,但当我选择其中一个对话框按钮时,取消分配错误仍然出现。@lnafziger为什么是属性而不是ivar?@achiral:您确定调用了初始化函数吗?设置断点并确保。@Richard:只要保留强引用,您可以使用其中任何一个。不过,使用属性是一种“最佳实践”,在以后需要更改时会有所帮助。@Richard:“private”属性只是一种声明的属性,不在公共头文件中,因此人们不会知道它。通常它位于.m文件顶部的类扩展名中。