Iphone CoreData调试与发布问题
好的,我有一个coreData模型,它有一个名为Iphone CoreData调试与发布问题,iphone,ios,core-data,Iphone,Ios,Core Data,好的,我有一个coreData模型,它有一个名为TechnicalQuery的实体。像这样 TechnicalQuery -------------- NSString *detail NSDate *createdDate NSString *solution NSString *name ... 在应用程序中,是一个同步过程(根据规范,该应用程序处于脱机状态),使用该应用程序的人员在返回办公室并连接时将进行同步。不管怎样,这并不重要 我使用相同的名称为TechnicalQuery创建了一个
TechnicalQuery
的实体。像这样
TechnicalQuery
--------------
NSString *detail
NSDate *createdDate
NSString *solution
NSString *name
...
在应用程序中,是一个同步过程(根据规范,该应用程序处于脱机状态),使用该应用程序的人员在返回办公室并连接时将进行同步。不管怎样,这并不重要
我使用相同的名称为TechnicalQuery
创建了一个NSManagedObject
子类
它定义了@属性
详细信息以及@动态
详细信息
目前数据库中只有一个技术查询。我可以看到这一点,通过使用应用程序查看技术查询“屏幕”上的所有细节等。。。它显示名称、解决方案、详细信息、创建日期等。。。一切都在那里
我可以在应用程序中更新解决方案文本。然后,当我稍后返回时,更新仍然存在。核心数据运行良好
当我同步回服务器时,我的问题就出现了
在调试中,这可以正常工作。我将同步进程转移到后台线程。然后,该线程查找自上次同步以来已更新的任何TQ,然后将其转换为JSON
数据。然后,它启动另一个队列并将这些TQ的所有上传排队
注意!在任何时候,我都不会在线程之间传递ManagedObjects
。我在一个函数中运行fetchrequest,然后存储数组,在下一个函数(同一线程)中处理数组。传递到下一个线程的唯一内容是它需要发送到的JSON
数据和特定于对象的URL,而根本没有CoreData对象
JSON数据由ManagedObject
子类文件中的一个函数收集(它实际上属于NSManagedObject
的一个类别,但您知道了……)该函数首先将对象转换为与服务器所需格式相匹配的NSDictionary
,然后将其转换
无论如何,在调试模式下(即直接从Xcode运行到我的iPhone5上),它工作正常。字典(上传数据都很好)
然而,(最终到达了那里)当在发布模式下运行时(即,当我在仪器中配置文件时),生成NSDictionary的函数爆炸了。它告诉我属性“detail”为nil。当我NSLog
属性时,它告诉我它为nil(在发布模式下),但显示文本(在调试模式下)
你可以看到这些都发生在不到一秒钟的时间里
第2行是collectData函数内部技术查询的name和detail属性的NSLog
第4行是processArray函数内部技术查询的name和detail属性的NSLog
如您所见,第4行显示了属性的空值
第6行是尝试将detail属性添加到NSMutableArray的异常日志。由于detail属性为null,因此出错
::编辑4::
添加具有线程ID的日志
1. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Collecting technical queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
2. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
3. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: pushing tech queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
4. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: (null) Detail: (null) Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
5. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: (null)
6. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail)
7. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Something Went Wrong!
1.Nov 29 10:32:08 Olivers-iPhone5[2749]:收集技术查询。线程:{name=(null),num=8}
2.Nov 29 10:32:08 Olivers-iPhone5[2749]:技术查询:名称:测试详细信息:来自Olivers iPhone的测试描述。线程:{Name=(null),num=8}
3.Nov 29 10:32:08 Olivers-iPhone5[2749]:推送技术查询。线程:{name=(null),num=8}
4.Nov 29 10:32:08 Olivers-iPhone5[2749]:技术查询:Name:(null)Detail:(null)Thread:{Name=(null),num=8}
5.Nov 29 10:32:08 Olivers-iPhone5[2749]:(空)
6.Nov 29 10:32:08 Olivers-iPhone5[2749]:异常!***setObjectForKey:对象不能为零(键:详细信息)
11月29日10:32:08 Olivers-iPhone5[2749]:出了点问题!
你可以从这里看到,我绝对不会在线程之间传递任何东西。这一切都发生在同一个线程上
再次感谢
::编辑5::
为了向您展示我是如何不编造这些内容的,下面是调试构建的日志
1. 2012-11-29 10:36:08.471 [2767:161f] Collecting technical queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
2. 2012-11-29 10:36:08.474 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
3. 2012-11-29 10:36:08.474 [2767:161f] pushing tech queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
4. 2012-11-29 10:36:08.475 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
5. 2012-11-29 10:36:08.476 [2767:161f] Test description from Olivers iPhone.
6. 2012-11-29 10:36:08.483 [2767:1623] Uploading to url <I can't put the URL here as it's private>
7. 2012-11-29 10:36:08.906 [2767:520f] Upload Done
收集技术查询。线程:{name=(null),num=8}
2.2012-11-29 10:36:08.474[2767:161f]技术查询:名称:测试详细信息:来自Olivers iPhone的测试描述。线程:{Name=(null),num=8}
3.2012-11-29 10:36:08.474[2767:161f]推送技术查询。线程:{name=(null),num=8}
4.2012-11-29 10:36:08.475[2767:161f]技术查询:名称:测试详细信息:来自Olivers iPhone的测试描述。线程:{Name=(null),num=8}
5.2012-11-29 10:36:08.476[2767:161f]奥利弗iPhone的测试说明。
6.2012-11-29 10:36:08.483[2767:1623]上传到url
7.2012-11-29 10:36:08.906[2767:520f]上传完成
这是完全相同的代码。唯一的区别是,这是在调试模式下运行的,日志是从Xcode复制的,而不是从Organizer设备日志复制的。Fogmeister
你并没有给我们提供太多的信息。因此,任何人都会猜测
首先,您可以调试代码的发布版本。只需更改Xcode方案中的配置文件
第二,当您切换到发布模式时,您的代码会发生什么变化?为什么调试编译时标志中的变化会改变您的产品(当您抛出调试标志时,核心数据不会改变,所以问题不大可能)
为了进一步帮助您,SO社区通常需要查看一些代码。如果您共享一些代码,人们可能会查看这些代码来帮助您
安德鲁我不知道最后的答案,但这可能会帮助您更接近解决方案 我们所知道的是,调试和发布配置上存在不同的行为。您应该检查构建设置中的所有差异,并尝试处理这些差异
我曾经在发布时遇到过类似的奇怪问题。在将优化级别更改为“最快、最小”后,该错误在调试时也可以重现。虽然我无法准确回答您的问题,但我遇到了这个问题,结果是
1. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Collecting technical queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
2. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
3. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: pushing tech queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
4. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: (null) Detail: (null) Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
5. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: (null)
6. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail)
7. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Something Went Wrong!
1. 2012-11-29 10:36:08.471 [2767:161f] Collecting technical queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
2. 2012-11-29 10:36:08.474 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
3. 2012-11-29 10:36:08.474 [2767:161f] pushing tech queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
4. 2012-11-29 10:36:08.475 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
5. 2012-11-29 10:36:08.476 [2767:161f] Test description from Olivers iPhone.
6. 2012-11-29 10:36:08.483 [2767:1623] Uploading to url <I can't put the URL here as it's private>
7. 2012-11-29 10:36:08.906 [2767:520f] Upload Done