我有一个名为exampleObject
的对象,其中包含两个字符串属性:moduleName
和pool
。
@property (nonatomic, assign) NSString *moduleName;
@property (nonatomic, assign) NSString *pool;
当触发IBAction时,这两个文件字段分别使用两个名为moduleNameField
和poolField
的文本字段进行设置:
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
的函数后,我尝试使用以下方法检索pool
和moduleName
属性:
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”,它不会崩溃。
非常感谢对此的任何见解!
答案 0 :(得分:2)
这听起来像是内存问题,您的NSString*
属性设置为分配。我建议将它们设置为copy
或至少retain
,并确保在dealloc方法中释放它们。由于它们被设置为分配消息,因此任何时候都可以生成崩溃,在这种情况下恰好是pool
。
答案 1 :(得分:1)
在Cocoa memory management rules之后,-text
等方法会返回您不拥有的实例。
如果你想保留它们,你需要取得所有权,最好使用copy
属性(以避免在传递可变字符串时出现问题)而不是assign
:
@property (nonatomic, copy) NSString *moduleName;