2010-02-01 44 views
0

当我检查一个为零的单身属性时,它会杀死我的应用程序。但是,当我检查类实例属性为零时,一切正常。检查具有零值的单身属性会导致错误

这工作得很好:

self.MyProperty == nil 

但是这会杀了以“EXC_BAD_ACCESS”

[MySingleton sharedManager].SomeProperty != 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

您需要发布更多的代码片段,以便人们可以考虑它们! – Yuji 2010-02-01 21:36:50

+0

显示更多编码。 – 2010-02-01 21:39:28

+0

我更新了线程以包含单例实现。 – 4thSpace 2010-02-01 21:43:46

回答

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的地址空间。可能是腐败。可能是错误的代码。

+0

是的 - 我发现它实际上并不是单身人士。我可以给SomeProperty分配一个字符串,它工作正常。这是来自函数的值,然后被赋值给SomeProperty,这是我需要处理的问题。谢谢。 – 4thSpace 2010-02-01 22:44:58

0

可能,无论您的+sharedManager方法返回的对象是什么,都不是有效的Objective-C对象,并且尝试访问该无效Objective-C对象的属性将导致EXC_BAD_ACCESS。另外,您确定EXC_BAD_ACCESS未出现+sharedManager

+0

它实际上是作为tableview单元格对象开始的。我没有注意到它创建的而不是NSObject。我已经剥离了所有的tableview单元代码,但似乎仍有一些引用该类的类。我将创建一个全新的NSObject类,看看是否有所作为。 – 4thSpace 2010-02-01 21:45:07

+0

上面的尝试没有任何区别。 – 4thSpace 2010-02-01 21:47:48

1

你有没有发布单身人士?看起来你正在返回的实例不再有效。我越权“发布”单例做什么,看看你是否仍然有一个问题...

+0

不是我能说的。我已经在dealloc中注释掉了该行,但该区域从来没有被我设置的断点所击中。 – 4thSpace 2010-02-01 22:36:28

0

更改此代码。

- (void)dealloc { 
    [SomeProperty dealloc]; 
    [super dealloc]; 
} 

像这样

- (void)dealloc { 
    [SomeProperty release]; 
    [super dealloc]; 
} 

不叫dealloc方法。除[超级dealloc]