2010-02-01 45 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]