使用nil值检查singleton属性会导致错误

时间:2010-02-01 21:17:57

标签: iphone objective-c cocoa-touch

当我检查单个属性为零时,它会杀死我的应用程序。但是当我在类实例属性上检查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>

我只在尝试分配时才得到上述内容。尝试读取变量时发生崩溃。

4 个答案:

答案 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]除外