2011-07-20 75 views
1

我有一個名爲exampleObject的對象,具有兩個字符串屬性:moduleNamepool字符串中的Objective-C空格

@property (nonatomic, assign) NSString *moduleName; 
@property (nonatomic, assign) NSString *pool; 

這兩種分別使用名爲moduleNameField和兩個文本字段設置,當IBAction爲被觸發:

NSLog(@"The moduleName is:%@", [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] moduleName]); 
NSLog(@"The pool is:%@", [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] pool]); 

if (![[moduleNameField text] isEqualToString:@""]) { 
    [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] setModulename:[moduleNameField text]]; 
} 
if (![[poolField text] isEqualToString:@""]) { 
    [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] setPool:[poolField text]]; 
} 

用的NSLog語句中檢查自己的價值後

我得到正確的輸出:

The moduleName is:Module Name One 
The pool is:Pool One 

這是它變得奇怪的地方。當調用exampleObject的功能,我嘗試使用檢索poolmoduleName屬性:

NSString *theModName = [NSString stringWithFormat:@"%@\n", [self moduleName]]; 
NSLog(@"The Name is:%@",theModName); 

NSString *thePool = [NSString stringWithFormat:@"%@\n", [self pool]]; 
NSLog(@"The Pool is:%@",thePool); 

我能去的第一個日誌聲明,它打印:

The Name is:Module Name One 

然而,該應用程序在沒有錯誤消息的情況下在下一行崩潰。更有趣的是,它只在thePool是帶空格或大小寫混合的字符串時纔會崩潰。如果不是「Pool One」,我已經把它變成了「Poolone」,它不會崩潰。

任何洞察到這一點將不勝感激!

回答

2

這聽起來像是一個內存問題,並且您的NSString*屬性設置爲分配。我建議將它們設置爲copy或至少retain,並確保在dealloc方法中釋放它們。由於它們被設置爲分配消息,因此任何時候都可能產生崩潰,在這種情況下恰好是pool

+0

神聖的地獄,是固定的, 。聲明屬性時我會更加小心!謝謝:)我會盡快接受你的回答 – hemlocker

1

Cocoa memory management rules之後,像-text這樣的方法會返回您不屬於的實例。

如果你想保持他們身邊,你需要採取所有權,preferrably使用copy屬性(也避免出現問題時,一個可變的字符串傳遞),而不是assign

@property (nonatomic, copy) NSString *moduleName;