gpt4 book ai didi

objective-c - 带有文件内容的数组 : results in crash

转载 作者:行者123 更新时间:2023-12-03 16:26:17 24 4
gpt4 key购买 nike

我正在创建一个应用程序,但收到 EXC_BAD_ACCESS 错误。


代码

@interface DNProjectsCategory : DNCategory {
NSArray *projects;
}

@property(nonatomic, retain) NSArray *projects;

@end

还有:

@implementation DNProjectsCategory
@synthesize projects;

// MEM

- (void)dealloc {
[projects release];

[super dealloc];
}

// INIT.
- (id)init {
if (self = [super init]) {
title = NSLocalizedString(@"PROJECTS", nil);
isSubCategory = NO;

// Initialize projects
//!!LINE 32 IS HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
projects = [NSArray arrayWithContentsOfFile:DNPROJECTSFILE];
}

return self;
}

// CATEGORIES

- (NSArray *)subCategories {
NSMutableArray *projectsArray = [[[NSMutableArray alloc] init] autorelease];

for (NSDictionary *project in projects) {
DNCategory *projectCategory = [[DNCategory alloc] initWithTitle:[project valueForKey:@"title"]
subCategories:nil
isSubCategory:YES];

[projectsArray addObject:projectCategory];
[projectCategory release];
}

return projectsArray;
}

DNPROJECTSFILE 的内容

参见http://gist.github.com/618628


控制台和仪器

这是控制台在运行时显示的内容(NSZombie 已启用):

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

以下是 Instruments 在 NSZombie 测试中的说法:

Zombie Messaged

An Objective-C message was sent to a deallocated object (zombie) at address: 0x10012af80.

 

Stack Trace

   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

问题

我真的不知道如何修复这个双重发布。据我所知,除了 dealloc 之外,我不会在任何地方释放 projects 变量。有人可以帮我吗?谢谢。

最佳答案

您没有使用访问器,因此项目永远不会保留。您的 init 方法有两种选择:

projects = [[NSArray arrayWithContentsOfFile:DNPROJECTSFILE] retain];

self.projects = [NSArray arrayWithContentsOfFile:DNPROJECTSFILE];

@property(nonatomic, retain) NSArray *projects;

该属性“创建”两个方法,一个 getter - (NSArray *)projects 和一个(在您的情况下更重要)setter - (void)setProjects:(NSArray*)a ; 您在属性声明中编写的保留语句仅适用于 setter。如果直接使用 projects = foo; 设置变量,则不会使用 setter。
但是 self.projects = foo; 相当于 [self setProject:foo],这是动态创建的 setter。
您的 setter 看起来与此类似:

- (void)setProjects:(NSArray*)anArray {
[anArray retain];
[projects release];
projects = anArray;
}

因此,如果您使用 setter,您从 arrayWithContentsOfFile: 获得的自动释放的 NSArray 将被保留。
在 Objective C 中进行的每个非“alloc”、“copy”、“retain”或任何以 new 开头的调用都会返回一个自动释放的对象。如果您想稍后使用它们(即在离开创建它们的方法之后),则必须保留它们。

也许您想再看一下 Apple Memory Managment Guide

关于objective-c - 带有文件内容的数组 : results in crash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com