【问题标题】:iPhone Tableview doesn't work for Apple testersiPhone Tableview 不适用于 Apple 测试人员
【发布时间】:2010-02-26 00:48:41
【问题描述】:

我的应用程序已被拒绝,因为该应用程序在 iPhone 应用程序审核小组审核时无法运行。该应用程序应该将单词加载到表格视图中,但在审查期间没有这样做。但是,该应用程序在我的 iPhone 上运行良好。关于为什么一个应用程序可以在一部 iPhone 上完美运行,但不能在审核过程中使用的 iPhone 上运行,您能否给我一些建议?

以下是技术细节:

  1. 该项目是在运行 Mac OS X 10.6.2 (10C540) 的 MacBook Pro 上编译的
  2. Xcode 版本 3.2.1 64 位 Xcode IDE:1613.0 Xcode Core:1614.0 ToolSupport:1591.0
  3. 基础 SDK 版本 3.1.3
  4. 优化级别:最快、最小 [-Os]
  5. 我的 iPhone 是带有 3.1.3 操作系统的 3GS

我怀疑方法 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 没有被调用。此方法在定义为 @interface WordTableViewController : GenericTableViewController 的委托中,其中类 GenericTableViewController 定义为 @interface GenericTableViewController : UITableViewController 。

我怀疑是上述情况,因为在我的开发过程中,调试 iPhone 上的发布版本显示 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 不是调用,尽管它是在同一部 iPhone 上调试调试版本时调用的。经过几天的调查,我解决了这个问题。我通过简单地更改发布配置中的优化级别然后将其更改回其原始值来解决它。这对我来说很奇怪。

对于最近提交的有问题的应用程序,我通过复制正常运行的发布配置来重新创建分发配置。然后,我通过复制该分发配置创建了一个临时配置。现在,该应用程序可以在我的 iPhone 上完美运行,用于发布、调试和临时分发。但是,它在 Apple 中不起作用。

我们将非常感谢您的 cmets!

【问题讨论】:

    标签: iphone app-store tableview appstore-approval


    【解决方案1】:

    需要考虑的一件事。 NSUserDefaults。

    当你做你的测试用例时,你有测试用例 UserDefaults 是:

    1. 空。
    2. 已损坏。

    Apple 将在没有用户默认值的情况下启动应用程序,如果您不时不清除它们,您的带有模拟器和目标硬件的测试台将存储默认值。

    如果您没有使用 NSUserDefaults 来存储状态数据,我们将需要更多信息。

    【讨论】:

    • 谢谢史蒂文。我没有使用 NSUserDefaults。但是,我想知道我对布拉德回应的最后评论是否有意义。我相信我可能已经逃脱了一些我不应该被允许做的事情。即,释放 NSMutableArray,然后在每次搜索时再次填充它。我将在下一条评论中添加一些代码。 (这段文字我几乎没有空间了。)
    • // 用于在这里发布:[list removeAllObjects]; while(sqlite3_step(statement) == SQLITE_ROW && (limit == NO || [list count]
    • 好的。大部分看起来都不错。我确实对谁拥有“sqlite3_column_text(statement, i);”中的内存有疑问称呼。同样,[[NSMutableArray alloc] init] 实际上应该是 [[NSMutableArray alloc] initWithCapacity:8]。 NSMutableArray 没有覆盖 init,有可能某些代码没有被调用,而实际上应该调用。此外,使用“arrayWithCapacity:”、“stringWithUTF8String:”等便捷方法。他们将从您的代码中删除大量版本,让您的生活更轻松。
    • 再次感谢您。我对 initWithCapacity:8 进行了更改。此外,SQLite 文档指出用于保存字符串和 BLOB 的内存空间会自动释放。不要将返回的 sqlite3_column_blob()、sqlite3_column_text() 等指针传递给 sqlite3_free()。所以没关系。 arrayWithCapacity 的优点是它基本上等同于 [[[NSMutableArray alloc] initWithCapacity: 1] autorelease],它更方便。 stringWithUTF8String 类似。我会经常使用这些!
    【解决方案2】:

    除了像 Steven 建议的那样从头开始清理(从 iPhone 中完全删除您的应用程序并重新安装它)之外,设备之间行为不一致的最大原因似乎与内存和线程相关。

    您声明您使用的是 iPhone 3GS,它的内存比旧款 iPhone / iPod touch 大得多。如果可以的话,您可以自己在这些旧设备之一上测试您的应用程序,或者找一个愿意对您的应用程序进行 Beta 测试的人(您提到有一个工作的临时构建,所以您大部分时间都是这样做的)。如果您无法访问这些设备之一,请使用内存监视器(而不是 ObjectAlloc)仪器在您的设备上运行您的应用程序,并观察您的应用程序的内存使用峰值。如果它在任何时候超过 20 MB,它可能会在旧设备上收到低内存警告,您的应用程序可能无法正确处理。您可以使用硬件在模拟器中人为地引发低内存警告 |模拟内存警告,看看会发生什么。

    如果您使用任何后台线程进行处理,它们也可能导致不确定的行为。 iPhone 3G S 的处理器比早期型号的 iPhone / iPod touch 快得多,因此您设备上的执行顺序可能与他们的不同。验证您是否正确锁定了对共享资源的访问,并且没有在后台线程上执行 UI 更新。

    【讨论】:

    • 非常感谢! 1) 我清理了 iPhone 上的旧应用程序。 2)我无法借到3G。我也找不到名为“内存管理器”的工具您强调您指的是“对象分配”以外的东西,所以我假设您指的是“泄漏”。 (我希望我理解正确)。因此,当它在我的 iPhone 上运行时,我在我的 Release 版本中使用了 Instruments。没有泄漏。启动时应用程序使用 610KB。 Apple 失败的功能使用 1.92MB。最密集的功能使用 6.20MB。后台线程上没有明确的 UI 更新。
    • 优化设置有任何影响的事实告诉我,你是对的,事情可能以不同的顺序执行。我现在正在查看我的 tableview 代码。我怀疑数据源(一个可变数组,它是我的 tableview 基类的成员)可能与问题有关。当用户在我的应用程序中进行搜索时,它会用结果填充表格。我曾经释放可变数组,然后在每次搜索时重新分配并再次填充它。我只是更改了它并在视图加载时分配一次,然后执行 removeAllObjects 并在每次搜索时重新填充数组。
    • 我指的是内存监视器仪器。在 Instruments 中,转到 Library 并将 Memory Monitor 仪器拖到您的仪器列表中,然后重新启动您的应用程序(或选择从 Default Target 下拉菜单中启动它)。它给出的读数是您的应用程序的真实内存使用情况(ObjectAlloc 和其他人隐藏了您的大部分 UI 内存使用情况)。
    • 简单地释放 NSMutableArray 并立即重新创建它如果在主线程上完成应该不会导致问题,因为这会阻止任何 UI 更新,直到整个操作完成。但是,我在 3.0 上使用 UITableView 之前看到过执行顺序问题(Apple 在 UITableView 类参考中列出了针对此类问题的解决方法)。
    • 帮助很大!我会经常使用那个记忆工具。它揭示了该功能期间的峰值内存使用量约为 12MB。在应用程序的内存和处理器密集程度更高的功能中(不是此问题的一部分),实际内存峰值达到 32MB(虚拟约为 300MB)。 MobileSafari 和 MobileMail 也达到了这个高点。我没有看到泄漏。所有这一切都说,我不认为我犯了任何严重的记忆罪(如果我错了,请纠正我)。但是,我将在您提到的 3.0 问题上查看 UITable。旅程仍在继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多