当我检查单个属性为零时,它会杀死我的应用程序。但是当我在类实例属性上检查nil时,一切正常。
这很好用:
self.MyProperty == nil
但这会以“EXC_BAD_ACCESS”
终止该应用[MySingleton sharedManager].SomeProperty != nil
我不能检查nil的单身人士有什么不同?
这是单例实现:
.h文件:
@interface MySingleton : NSObject {
NSString * SomeProperty;
}
@property (nonatomic, copy) NSString * SomeProperty;
+(MySingleton *)sharedManager;
@end
.m文件:
#import "MySingleton"
static MySingleton *sharedManager = nil;
@implementation MySingleton
@synthesize SomeProperty;
- (void)dealloc {
[SomeProperty dealloc];
[super dealloc];
}
+(MySingleton *)sharedManager
{
if (!sharedManager){
sharedManager = [[MySingleton alloc] init];
}
return sharedManager;
}
当我尝试将某些内容分配给SomeProperty时,这是我在控制台中找到的内容:
MyApp(51363,0xa0389500) malloc: *** mmap(size=2147487744) failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug Current language: auto; currently objective-c (gdb) break malloc_error_break Note: breakpoints 6 and 8 also set at pc 0x929c2072. Breakpoint 11 at 0x929c2072 (gdb) continue (gdb) po [MySingleton sharedManager].SomeProperty Cannot access memory at address 0x0 (gdb) po [MySingleton sharedManager] <Session: 0x1938fa0>
我只在尝试分配时才得到上述内容。尝试读取变量时发生崩溃。
答案 0 :(得分:3)
鉴于此:
- (void)dealloc {
[someKey dealloc];
[super dealloc];
}
还有一些其他的代码,我会说它很可能代码中还有其他问题,这些问题的组合导致了你所暗示的问题。特别是,您应永远直接致电-dealloc
([super dealloc]
除外)。如果你在代码的其他部分有这个并且正在执行它,它很容易导致你描述的症状。
如果您想要更具体的答案,请发布崩溃的回溯。
MyApp(51363,0xa0389500) malloc: * mmap(size=2147487744) failed (error code=12) error: can't allocate region
** set a breakpoint in malloc_error_break to debug Current language: auto; currently objective-c
按照指示设置断点,然后重新运行应用程序。一旦出现该错误消息,所有投注都会关闭,因为您的应用已经被清除。您需要进行该呼叫的回溯。
然而,正在发生的事情是要求mmap()映射到2GB的地址空间。可能是腐败。可能是错误的代码。
答案 1 :(得分:1)
你有没有发行单身人士?看起来您返回的实例不再有效。我会覆盖“释放”让单身人士什么也不做,看看你是否还有问题...
答案 2 :(得分:0)
可能,+sharedManager
方法返回的任何类型的对象都不是有效的Objective-C对象,并且尝试访问该无效Objective-C对象的属性将导致EXC_BAD_ACCESS
。此外,您确定 EXC_BAD_ACCESS
中的+sharedManager
未发生吗?
答案 3 :(得分:0)
更改此代码。
- (void)dealloc {
[SomeProperty dealloc];
[super dealloc];
}
喜欢这个
- (void)dealloc {
[SomeProperty release];
[super dealloc];
}
请勿调用dealloc方法。 [super dealloc]除外