【问题标题】:NSDictionary losing its contents (exc bad access)NSDictionary 丢失其内容(不包括不良访问)
【发布时间】:2010-07-29 10:00:25
【问题描述】:

所以我有一个 uiviewcontroller。它具有 NSMutableArray 的属性,具有合成的非原子保留属性。

在 viewDidLoad 中,我使用以下内容对其进行了初始化,并向导航栏添加了一个按钮。

test = [NSDictionary dictionaryWithObjectsAndKeys:
        [[SearchField alloc] initWithName:@"Subject" :Text], kSubjectKey, 
        [[SearchField alloc] initWithName:@"Source publication" :Text], kSourceKey,
        [[SearchField alloc] initWithName:@"Keyword" :Text], kKeywordKey,
        [[SearchField alloc] initWithName:@"Author" :Text], kAuthorKey,
        [[SearchField alloc] initWithName:@"Color" :Bool], kColorKey,
        nil ];

NSLog([NSString stringWithFormat:@"lol %d", [test count]]);

通过调试器运行时,第一个日志运行良好。但是,我已将以下代码绑定到按钮:

-(void)search:(id)sender{

    NSLog([NSString stringWithFormat:@"lol %d", [test count]]);

当此代码执行时,日志行因 exc 错误访问而崩溃。 在 viewDidLoad 和按钮按下之间的 NSDictionary 没有发生任何事情,那么为什么会发生这种情况呢?更重要的是,我该如何解决? :)

干杯

编辑 我想也许是我的 SearchField 类在做事,所以我用简单的字符串替换了它们,问题仍然存在。

【问题讨论】:

  • NSLog(@"lol %d", [test count]);我不确定这会解决你的错误,但你不需要在这里创建字符串对象
  • 谢谢!我一直在毫无意义地创建字符串对象:)
  • 也感谢所有的答案,我修复它没有问题,我得到了更好的理解。

标签: iphone objective-c nsdictionary


【解决方案1】:

你是直接访问成员变量——你需要通过访问器——即:

self.test = [NSDictionary dictionaryWithObje ...

这将确保您的对象保留字典。

【讨论】:

  • 为清楚起见,我将补充一点,此建议不适用于 ARC。如果您使用 ARC 并且已合成 ivar,即使您不使用 self.,编译器也会为您保留。 (基于我今天找到的多个 SO 答案。)
【解决方案2】:
  1. 确保test 是一个类变量,将其设置为视图控制器标题的属性:

    @property (nonatomic, retain) NSDictionary *test;

  2. 在视图控制器的-dealloc 方法中释放它:

    [test release], test = nil;

  3. 设置其值如下:

    self.test = [NSDictionary dictionaryWithObjectsAndKeys:...];

  4. 按如下方式访问其count 属性:

    NSLog(@"Count: %u", test.count);

    或者:

    NSLog(@"Count: %u", [test count]);

    注意-count返回一个无符号整数,所以你应该使用%u来格式化它的值。

【讨论】:

    【解决方案3】:

    您正在创建的字典是自动发布的。您正在使用一种方便的方法 (dictionaryWithObjectsAndKeys:),它返回一个新的自动释放对象。

    自动释放的对象在创建后的某个时间被释放(并解除分配),这就是它在程序后期崩溃的原因。

    您需要保留返回的字典,或者使用 alloc/init 方法创建一个新的字典。

    无论哪种方式,您都需要记住在使用完字典后释放它。

    您应该阅读 Objective-C 的基本内存管理规则和约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多