Iphone NSDictionary丢失其内容(exc错误访问)

Iphone NSDictionary丢失其内容(exc错误访问),iphone,objective-c,nsdictionary,Iphone,Objective C,Nsdictionary,所以我有一个uiviewcontroller。它具有NSMutableArray的属性,并合成了非原子保留属性 在viewDidLoad中,我使用以下命令初始化它,并向导航栏添加一个按钮 test = [NSDictionary dictionaryWithObjectsAndKeys: [[SearchField alloc] initWithName:@"Subject" :Text], kSubjectKey, [[SearchField alloc] i

所以我有一个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类在做一些事情,所以我用简单的字符串替换它们,问题仍然存在

您正在直接访问成员变量-您需要通过访问器-即:

self.test = [NSDictionary dictionaryWithObje ...

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

您正在创建的字典将自动删除。您正在使用一个方便的方法(
DictionaryWithObjectsSandKeys:
)返回一个新的自动删除对象

自动释放的对象在创建后一段时间被释放(和释放),这就是为什么它在程序中稍后崩溃的原因

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

不管是哪种方式,你都需要记住在使用完字典后将其发布

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

  • 通过将
    test
    设置为视图控制器标题的属性,确保它是一个类变量:

    @属性(非原子,保留)NSDictionary*测试

  • 在视图控制器的
    -dealoc
    方法中释放它:

    [test release],test=nil

  • 按如下方式设置其值:

    self.test=[NSDictionary Dictionary WithObjectsAndKeys:…]

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

    NSLog(@“计数:%u”,测试计数)

    或:

    NSLog(@“计数:%u”,[test Count])

    请注意,
    -count
    返回一个无符号整数,因此应使用
    %u
    格式化其值


  • NSLog(@“lol%d”,[测试计数]);我不确定这是否能解决您的错误,但您不需要在此创建字符串对象谢谢!我一直在毫无意义地创建字符串对象:)也感谢所有的答案,我毫无问题地修复了它,并且我得到了更好的理解。为了清楚起见,我只想补充一点,这个建议不适用于ARC。如果您使用的是ARC,并且ivar是合成的,那么即使您不使用
    self.
    ,编译器也会为您执行retain操作。(基于我今天找到的多个SO答案。)