字符串中的Objective-C空格

时间:2011-07-20 20:56:58

标签: objective-c nsstring

我有一个名为exampleObject的对象,其中包含两个字符串属性:moduleNamepool

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

当触发IBAction时,这两个文件字段分别使用两个名为moduleNameFieldpoolField的文本字段进行设置:

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语句检查其值后:

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

我得到了正确的输出:

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 个答案:

答案 0 :(得分:2)

这听起来像是内存问题,您的NSString*属性设置为分配。我建议将它们设置为copy或至少retain,并确保在dealloc方法中释放它们。由于它们被设置为分配消息,因此任何时候都可以生成崩溃,在这种情况下恰好是pool

答案 1 :(得分:1)

Cocoa memory management rules之后,-text等方法会返回您不拥有的实例。

如果你想保留它们,你需要取得所有权,最好使用copy属性(以避免在传递可变字符串时出现问题)而不是assign

@property (nonatomic, copy) NSString *moduleName;