2010-11-08 35 views
0

堅持我。我有視覺障礙,以前從未使用過此網站,並且可能不會按照您習慣的格式進行發佈。我對此處的任何無意失禮表示歉意。爲什麼我的單身人士課程不能返回一個值將保持在範圍內

在iOS的項目中使用的Objective-C ...

我有一個單獨的類中,這似乎是對Objective-C的通常的方式成立。它主要是一系列接受NSString值的方法,解釋它們並返回其他內容。在下面的代碼中,我將事物簡化到最低限度,以強調我遇到的問題。

從單例類:

- (NSUInteger) assignControlState:(NSString *)state { 
    // excerpted for clarity... 
    return UIControlStateNormal; // an example of what might be returned 
} 

現在,另一個類的一個實例,試圖用這種方法,像這樣:

- (void) buttonSetup:(UIButton*)button { 
    [button setTitle:@"something" forState:[[SingletonClass accessToInstance] assignControlState:@"normal"]]; 
} 

此代碼實際工作。 HOwever,當系統繪製包含按此方式設置標題的按鈕的UI時,會發生EXC_BAD_ACCESS錯誤。

如果assignControlState方法被移入與buttonSetup方法相同的類中,則不會生成錯誤。

我猜這是關於蘋果公司內存管理的一些事情,我沒有完全理解,以及事情如何進出範圍,但對於我的生活,我無法弄清楚我在哪裏出錯了。

HO有人可以幫忙。謝謝。

+0

很難說這些代碼行。從附加的調試器開始(不僅僅是調試模式),您將獲得非常有用的信息。 – Eiko 2010-11-08 23:53:02

+0

這與範圍無關。這只是不正確的內存管理,通常與Objective-C中的範圍無關。 – Chuck 2010-11-08 23:59:54

回答

2

問題出在您的accessToInstance方法中。我敢打賭,你保持不足。實施應該更像:現在

static SingletonClass *sSingletonClass = nil; 

@implementation 

+ (id)accessToInstance { 
    if (sSingletonClass == nil) { 
    sSingletonClass = [[[self class] alloc] init]; 
    } 
    return sSingletonClass; 
} 
@end 

,如果你的程序是按正常的內存管理規則,單身會呆在身邊。您可以通過書面檢查:

- (void)dealloc { 
    [super dealloc]; // <-- set a breakpoint here. 
} 

如果調試器曾經在這個斷點處停止,你知道你的程序事情已經過發佈了單。

+0

謝謝。 HOwever,就我所知,你對單身人士的執行與我的要領完全相同。然而,我確實是否在單身人士身上調用了dealloc。事實並非如此。 – Josh 2010-11-09 03:12:40

+0

奇怪的是:如果我簡單地使用NSLog()來輸出單例方法返回的值,它將打印出來,執行其業務,並最終再次鎖定EXC_BAD_ACCESS錯誤。注意NSLog()可以避免這個問題。對於絕對任何導致問題的東西,似乎都使用單例,即使沒有任何東西試圖引用它返回的數據。 *嘆* – Josh 2010-11-09 03:14:55

0

你知道這句話是爲了清晰起見而摘錄的嗎?我認爲你需要向我們展示它是什麼,因爲它可能在某處發佈過度版本。

具體來說,我認爲你釋放一個autoreleased對象。如果你這樣做並且不再使用這個對象,那麼一切都會正常進行,直到autorelease池被耗盡。在繪圖通常發生的同時,autorelease池會在事件結束時自動排空。

這也將解釋NSLogs後的延遲崩潰。

相關問題