Objective c arrayWithContentsOfFile:导致崩溃
我正在创建一个应用程序,我得到一个EXC_BAD_访问错误Objective c arrayWithContentsOfFile:导致崩溃,objective-c,cocoa,memory,nszombie,Objective C,Cocoa,Memory,Nszombie,我正在创建一个应用程序,我得到一个EXC_BAD_访问错误 代码 以及: DNPROJECTSFILE的内容 看 控制台和仪器 这是运行时控制台所说的(NSZombie已启用): 以下是仪器在NSZombie测试中的说明: 僵尸留言 已向地址为0x10012af80的解除分配对象(僵尸)发送Objective-C消息 堆栈跟踪 问题: 我真的不知道如何修复这个双重版本。因为据我所知,除了在dealoc中,我不会在任何地方释放projects变量。谁能帮帮我吗?谢谢。您没有使用访问器,因
代码 以及:
DNPROJECTSFILE的内容 看
控制台和仪器 这是运行时控制台所说的(NSZombie已启用): 以下是仪器在NSZombie测试中的说明: 僵尸留言 已向地址为0x10012af80的解除分配对象(僵尸)发送Objective-C消息 堆栈跟踪
问题:
我真的不知道如何修复这个双重版本。因为据我所知,除了在
dealoc
中,我不会在任何地方释放projects
变量。谁能帮帮我吗?谢谢。您没有使用访问器,因此项目永远不会保留。
init方法有两种选择:
projects = [[NSArray arrayWithContentsOfFile:DNPROJECTSFILE] retain];
或
属性“创建”两个方法,一个是getter
-(NSArray*)projects
,另一个是setter-(void)setProjects:(NSArray*)a代码>在属性声明中编写的retain语句仅适用于setter。如果直接使用projects=foo设置变量代码>未使用设置器。
但是self.projects=foo
相当于动态创建的setter[self-setProject:foo]
。
您的setter与此类似:
- (void)setProjects:(NSArray*)anArray {
[anArray retain];
[projects release];
projects = anArray;
}
因此,如果使用setter,将保留从arrayWithContentsOfFile:获取的自动删除的NSArray。
您在Objective C中所做的每一个不是“alloc”、“copy”、“retain”或任何以new开头的调用都会返回一个自动释放的对象。如果您想在以后使用它们(即,在您离开创建它们的方法之后),则必须保留它们
也许您想再看一看#define dnprojects文件[[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES)objectAtIndex:0]stringByAppendingPathComponent:@/RSONIC Done/projects.xml]
@Andrew一堆NSDictrionaries。它起作用了,但我真的不明白它是如何起作用的。你能解释一下吗?我一直不明白retain
是如何工作的^^@Koning:[NSArray array…]
方法返回一个自动删除的实例。因此,在保留初始值设定项之后的某个时间,实例由自动释放池释放。为了防止出现这种情况,您需要保留该实例,以表示您希望/需要保留该实例。您可以手动调用retain
,或者将其分配给为您执行保留的属性(因为它具有保留标志)。@koning baard我在我的编辑中解释了保留发布问题的另一面。嗯。
run
[Switching to process 41257]
Running…
2010-10-09 23:32:36.899 Done[41257:a0f] *** -[CFString isKindOfClass:]: message sent to deallocated instance 0x1001caab0
sharedlibrary apply-load-rules all
0 CoreFoundation _CFRuntimeCreateInstance
1 CoreFoundation __CFStringCreateImmutableFunnel3
2 CoreFoundation CFStringCreateWithBytes
3 CoreFoundation _uniqueStringForCharacters
4 CoreFoundation getString
5 CoreFoundation parseXMLElement
6 CoreFoundation parseXMLElement
7 CoreFoundation parseArrayTag
8 CoreFoundation parseXMLElement
9 CoreFoundation parsePListTag
10 CoreFoundation parseXMLElement
11 CoreFoundation _CFPropertyListCreateFromXMLStringError
12 CoreFoundation _CFPropertyListCreateWithData
13 CoreFoundation CFPropertyListCreateFromXMLData
14 Foundation _NSParseObjectFromASCIIPropertyListOrSerialization
15 Foundation +[NSArray(NSArray) newWithContentsOf:immutable:]
16 Foundation +[NSArray(NSArray) arrayWithContentsOfFile:]
17 Done -[DNProjectsCategory init] /Users/rsonic/Developer/Done/DNProjectsCategory.m:32
18 Done -[DNBindingsController categories] /Users/rsonic/Developer/Done/DNBindingsController.m:18
19 Foundation -[NSObject(NSKeyValueCoding) valueForKey:]
20 Foundation -[NSObject(NSKeyValueCoding) valueForKeyPath:]
21 AppKit -[NSBinder valueForBinding:resolveMarkersToPlaceholders:]
22 AppKit -[NSArrayDetailBinder _refreshDetailContentInBackground:]
23 AppKit -[NSObject(NSKeyValueBindingCreation) bind:toObject:withKeyPath:options:]
24 AppKit -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]
25 AppKit loadNib
26 AppKit +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]
27 AppKit +[NSBundle(NSNibLoading) loadNibNamed:owner:]
28 AppKit NSApplicationMain
29 Done main /Users/rsonic/Developer/Done/main.m:13
30 Done start
projects = [[NSArray arrayWithContentsOfFile:DNPROJECTSFILE] retain];
self.projects = [NSArray arrayWithContentsOfFile:DNPROJECTSFILE];
@property(nonatomic, retain) NSArray *projects;
- (void)setProjects:(NSArray*)anArray {
[anArray retain];
[projects release];
projects = anArray;
}