Iphone NSDictionary丢失其内容(exc错误访问)
所以我有一个uiviewcontroller。它具有NSMutableArray的属性,并合成了非原子保留属性 在viewDidLoad中,我使用以下命令初始化它,并向导航栏添加一个按钮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
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答案。)