2009-05-26 53 views
0

我想使用核心圖形上下文編寫文本。我可以第一次做到這一點,沒問題,但第二次崩潰我的iPhone應用程序。下面的代碼片段:NSString到C風格的字符數組崩潰第二次調用drawRect

NSString *name = [MyClass getName]; 
const char *cname = [name UTF8String]; 
[self drawText:context text:cname]; 

MyClassdrawText是自定義的類/方法,但你的想法。這三行生活在drawRect:

第一次執行drawRect:時,我看到了預期的文字。然而,在任何刷新的drawRect:,該行:

const char *cname = [name UTF8String]; 

導致我的應用程序與神祕,"GDB: Program loaded."狀態消息崩潰。

即使使用getCString:方法,我也會得到類似的回覆。我想我可能會錯過對NSString char數組轉換的基本理解。

+0

我對這篇文章太陌生了,所以我無法評價響應者。但是,他們是正確的,因爲我正在取消引用已發佈的對象。我讓NSString成爲一個全局變量(這對於每個drawRect重新分配它都沒有問題:無論如何效率似乎都很低)。基本上我最終刪除了第一行,一切按預期工作。謝謝! – 2009-05-26 22:48:28

回答

3

聽起來好像你正試圖調用已經被釋放的對象的方法。消息UTF8String存在一個問題,即您無法保存返回的指針,因爲它在釋放字符串時可能會失效 - 如果需要保留該字符串,則必須複製該字符串。但是,getCString:maxLength:encoding:沒有這個問題。

請確保您遵循正確的內存管理協議。請參閱Memory Management Programming Guide for Cocoa,並仔細檢查您是否在正確的時間將retainreleaseautorelease消息發送給適當的對象。如果你不應該這樣做,或者你忘記了retain你的字符串,你可能會發送額外的releaseautorelease