Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c arrayWithContentsOfFile:导致崩溃_Objective C_Cocoa_Memory_Nszombie - Fatal编程技术网

Objective c arrayWithContentsOfFile:导致崩溃

Objective c arrayWithContentsOfFile:导致崩溃,objective-c,cocoa,memory,nszombie,Objective C,Cocoa,Memory,Nszombie,我正在创建一个应用程序,我得到一个EXC_BAD_访问错误 代码 以及: DNPROJECTSFILE的内容 看 控制台和仪器 这是运行时控制台所说的(NSZombie已启用): 以下是仪器在NSZombie测试中的说明: 僵尸留言 已向地址为0x10012af80的解除分配对象(僵尸)发送Objective-C消息 堆栈跟踪 问题: 我真的不知道如何修复这个双重版本。因为据我所知,除了在dealoc中,我不会在任何地方释放projects变量。谁能帮帮我吗?谢谢。您没有使用访问器,因

我正在创建一个应用程序,我得到一个EXC_BAD_访问错误


代码 以及:


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;
}