iPhone - 从 touchesMovedwithEvent 更新 NSMutablearray 的第 n 个对象的属性

Posted

技术标签:

【中文标题】iPhone - 从 touchesMovedwithEvent 更新 NSMutablearray 的第 n 个对象的属性【英文标题】:iPhone - update the property of nth object of a NSMutablearray from touchesMovedwithEvent 【发布时间】:2011-05-16 16:06:10 【问题描述】:

在我之前在iPhone - update the property of nth object of a NSMutablearray 的帖子中,我得到了一些在 viewDidLoad 中有效的东西,但是当我尝试在 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 中使用几乎相同的代码时应用程序崩溃。

@接口

int activeItem;
int startFrom;
NSMutableArray *iconsMutableArray;
NSMutableArray *textsMutableArray;

然后

@property int activeItem;
@property int startFrom;
- (NSMutableArray *)iconsMutableArray;
- (NSMutableArray *)textsMutableArray;


@synthesize activeItem;
@synthesize startFrom;

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event    
    activeItem = (int)startFrom + (int)round(animationEndTo/AngleForEachItem);  
    [[iconsMutableArray objectAtIndex:activeItem] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Guide-Icon-%d_Active.png", activeItem]]];

但我的应用程序无法更新 UIIMageView 并崩溃而没有显示任何错误消息。 谁能帮帮我吗? 提前致谢。

以下是崩溃报告:

异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常代码:0x0000000032200002 处的 KERN_INVALID_ADDRESS 崩溃的线程:0 调度队列:com.apple.main-thread

应用特定信息: objc_msgSend() 选择器名称:objectAtIndex: iPhone 模拟器 238.2、iPhone OS 4.3 (iPad/8F192) iPhone 模拟器 238.2、iPhone OS 4.3 (iPad/8F192)

线程 0 崩溃:调度队列:com.apple.main-thread 0 libobjc.A.dylib 0x0197a09f objc_msgSend + 19 1 ??? 0x00229810 OBJC_CLASS_$_NSNumber + 0 2 UIKit 0x003b90f4 forwardMethod2 + 92 3 UIKit 0x003b90f4 forwardMethod2 + 92 4 UIKit 0x0030fd97-[UIWindow_sendTouchesForEvent:] + 481 5 UIKit 0x002f0c37-[UIApplication 发送事件:] + 447 6 UIKit 0x002f5f2e _UIApplicationHandleEvent + 7576 7 图形服务 0x01e87992 PurpleEventCallback + 1550 8 核心基础 0x017f5944 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52 9 核心基础 0x01755cf7 __CFRunLoopDoSource1 + 215 10 核心基础 0x01752f83 __CFRunLoopRun + 979 11 核心基础 0x01752840 CFRunLoopRunSpecific + 208 12 核心基础 0x01752761 CFRunLoopRunInMode + 97 13 图形服务 0x01e861c4 GSEventRunModal + 217 14 图形服务 0x01e86289 GSEventRun + 115 15 UIKit 0x002f9c93 UIApplicationMain + 1160 16 MJA 0x00002bde 主 + 96 (main.m:14) 17 MJA 0x00002b75 开始 + 53

线程 1: 0 libSystem.B.dylib 0x9119d922 kevent + 10 1 libdispatch_sim.dylib 0x01d92f36 _dispatch_mgr_invoke + 237 2 libdispatch_sim.dylib 0x01d93333 _dispatch_queue_invoke + 162 3 libdispatch_sim.dylib 0x01d93593 _dispatch_worker_thread2 + 261 4 libSystem.B.dylib 0x9119cd21 _pthread_wqthread + 390 5 libSystem.B.dylib 0x9119cb66 start_wqthread + 30

线程 2:WebThread 0 libSystem.B.dylib 0x9117709a mach_msg_trap + 10 1 libSystem.B.dylib 0x91177807 mach_msg + 68 2 核心基础 0x017f5d86 __CFRunLoopServiceMachPort + 150 3 核心基础 0x01752e74 __CFRunLoopRun + 708 4 核心基础 0x01752840 CFRunLoopRunSpecific + 208 5 核心基础 0x01752761 CFRunLoopRunInMode + 97 6 WebCore 0x02f13913 RunWebThread(void*) + 499 7 libSystem.B.dylib 0x911a47fd _pthread_start + 345 8 libSystem.B.dylib 0x911a4682 thread_start + 34

线程 3: 0 libSystem.B.dylib 0x9117709a mach_msg_trap + 10 1 libSystem.B.dylib 0x91177807 mach_msg + 68 2 CoreFoundation 0x017f5d86 CFRunLoopServiceMachPort + 150 3 核心基础 0x01752e74 __CFRunLoopRun + 708 4 核心基础 0x01752840 CFRunLoopRunSpecific + 208 5 核心基础 0x01752761 CFRunLoopRunInMode + 97 6 基础 0x0008b102 +[NSURLConnection(NSURLConnectionReallyInternal)_resourceLoadLoop:] + 398 7 基础 0x00055cf4 -[NSThread 主线程] + 81 8 基础 0x00055c80 __NSThread__main + 1387 9 libSystem.B.dylib 0x911a47fd _pthread_start + 345 10 libSystem.B.dylib 0x911a4682 thread_start + 34

线程 4:com.apple.CFSocket.private 0 libSystem.B.dylib 0x91196066 选择$DARWIN_EXTSN + 10 1 核心基础 0x017872bc __CFSocketManager + 812 2 libSystem.B.dylib 0x911a47fd _pthread_start + 345 3 libSystem.B.dylib 0x911a4682 thread_start + 34

线程 0 因 X86 线程状态(32 位)而崩溃: eax:0x05e0e840 ebx:0x05a0ef11 ecx:0x05a05484 edx:0x05e6b200 edi:0x32200002 esi:0x00229810 ebp:0xbfffd728 esp:0xbfffd6c4 ss:0x0000001f efl:0x00010202 eip:0x0197a09f cs:0x00000017 ds: 0x0000001f es: 0x0000001f fs: 0x00000000 gs: 0x00000037 cr2: 0x32200002

【问题讨论】:

嗨 Jhaliya,我已经添加了崩溃报告。请立即查看 【参考方案1】:

在崩溃日志的顶部注意这一点;

异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常代码: KERN_INVALID_ADDRESS 在 0x0000000032200002 线程崩溃:0 调度队列:com.apple.main-thread

任何时候你看到EXC_BAD_ACCESS,你的第一个想法应该是'我已经过度释放了一些对象'。

正如@csch 所说,你应该打开僵尸,看看会告诉你什么信息。

我的猜测是iconsMutableArray 是通过这样一段代码初始化的;

iconsMutableArray = [NSMutableArray array];

分配但不保留(阅读内存管理指南here)。

您还应该使用手势识别器,而不是自己实现触摸处理。阅读here。

【讨论】:

谢谢比尔,我已经通过改变声明解决了:iconsMutableArray = [[[NSMutableArray alloc] init] retain]; 不,这不是最好的解决办法。请阅读我链接到的文档。虽然您不再因那行代码而崩溃,但您正在泄漏。【参考方案2】:

看起来iconsMutableArray 是在某个地方发布的,或者从未设置过。也许您将其设置为自动释放的对象而忘记了retain

【讨论】:

嗯我忘了保留那个,实际上我不知道:p【参考方案3】:

我建议在多行中重写代码,然后使用调试器单步执行以查看图像或数组是否为 nil。也有可能您正在访问超出范围的索引。

还将 NSZombieEnabled 设置为 YES,如 here 所述。这可能会给你更详细的错误信息。

【讨论】:

以上是关于iPhone - 从 touchesMovedwithEvent 更新 NSMutablearray 的第 n 个对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将音乐文件从 iphone 音乐库导入 iPhone 应用程序

从 iPhone 4s 到 iPhone 6+ 具有自适应布局的间距布局元素

如何使用 node.js 和 socket.io 将文件从 iPhone 发送到另一台 iPhone?

从 iPhone 到另一台设备(浏览器或 iPhone)的实时音频/视频流

从 iPhone 设备查找当前国家

从 QQ “振动” 理解 iPhone 通知