【发布时间】:2018-09-23 01:19:10
【问题描述】:
完整的项目可以在这里看到(上下文:https://github.com/atlas-engineer/next-cocoa)
以下代码返回 EXC_BAD_ACCESS:
- (bool)windowClose:(NSString *)key
{
NSWindow *window = [[self windows] objectForKey:key];
[[self windows] removeObjectForKey:key];
[window close];
return YES;
}
但是,下面的代码可以工作
- (bool)windowClose:(NSString *)key
{
[[self windows] removeObjectForKey:key];
return YES;
}
如下:
- (bool)windowClose:(NSString *)key
{
NSWindow *window = [[self windows] objectForKey:key];
[window close];
return YES;
}
只有当你把它们放在一起时,一切都会破裂。
作为参考,我在下面提供了 AutokeyDictionary 的实现,也就是上面例子中[self windows] 的值
//
// AutokeyDictionary.m
// next-cocoa
//
// Created by John Mercouris on 3/14/18.
// Copyright © 2018 Next. All rights reserved.
//
#import "AutokeyDictionary.h"
@implementation AutokeyDictionary
@synthesize elementCount;
- (instancetype) init
{
self = [super init];
if (self)
{
[self setElementCount:0];
_dict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (NSString *) insertElement:(NSObject *) object
{
NSString *elementKey = [@([self elementCount]) stringValue];
[_dict setValue:object forKey: elementKey];
[self setElementCount:[self elementCount] + 1];
return elementKey;
}
- (NSUInteger)count {
return [_dict count];
}
- (id)objectForKey:(id)aKey {
return [_dict objectForKey:aKey];
}
- (void)removeObjectForKey:(id)aKey {
return [_dict removeObjectForKey:aKey];
}
- (NSEnumerator *)keyEnumerator {
return [_dict keyEnumerator];
}
- (NSArray*)allKeys {
return [_dict allKeys];
}
@end
最后,为了记录,打开僵尸确实可以使代码工作,尽管这显然不是解决方案。
【问题讨论】:
-
@matt 我删除了
return并将其保留为[_dict removeObjectForKey:aKey];,但仍然没有运气。 -
@matt,我还没有关闭 ARC,但是如果有办法检查它是否仍然启用,我很乐意提供帮助
-
“使用未声明的标识符保留”,因此必须启用 ARC,我很想将其关闭,因为它似乎比它更麻烦
-
您窗口的
releasedWhenClosed属性可能默认为YES,这可能与ARC 的内存管理冲突。将其设置为NO。 -
@matt 如果你想看看,你可以在此处克隆项目:github.com/atlas-engineer/next-cocoa server.m 是调用此方法的原因,也许它会导致问题成为块或其他东西的一部分,而不是确定
标签: objective-c memory-management exc-bad-access