标题文件:
@interface Picker : UITableViewController <NSXMLParserDelegate> {
NSMutableString *currentRow;
}
@property (nonatomic, retain) NSMutableString *currentRow;
@end
实施档案:
#import "Picker.h"
@implementation Picker
@synthesize currentRow;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
currentRow = [[NSMutableString alloc] initWithString:@"VehicleYear"];
}
return self;
}
@end
调试完这个并进入currentRow用字符串初始化的地方。跳过语句然后将鼠标悬停在currentRow上,值显示“无效摘要”。 它似乎得到一个指针,因为我得到一个地址引用类似0x33112而不是实际的内存引用。 无论我做什么,我都无法在此属性中获得有效字符串,因此我的所有比较都失败了。我做错了什么?
答案 0 :(得分:4)
我不知道这是否与它有关,但是如果你阅读initWithString:
方法的文档,它会返回NSString
的子类的实例,这可能是也可能不是NSMutableString
试试这个,它会做你想要的:
currentRow = [@"VehicleYear" mutableCopy];
此外,99%的时间你想要一个类的字符串属性你想要声明它:
@property(readwrite,copy)NSString *name;
如果将readwrite字符串属性声明为除复制之外的任何内容,则设置它的任何人都可以更改其字符串并影响对象的内部状态,这通常不是您想要的。如果原始字符串不可变,则其复制方法无论如何都会保留,因此在重要的情况下不会丢失性能。
如果你想要一个内部可变的字符串,没有外部用户可以改变你可能想要声明这样的属性:
@property(readwrite,copy)NSString *name;
然后自己实施-name
和-setName:
,以便您可以调用-mutableCopy
在getter中设置它并-copy
,这样他们就无法更改您的内部状态。我已经写了很多关于这个on my blog的文章。
注意这个
@property(readwrite,copy)NSMutableString *name;
当你对访问者进行@synthesize时,不会做任何人想要的事情,因为setter会调用-copy
并获得一个NSString,而NSString不是NSMutableString的结果。
答案 1 :(得分:1)
我有时会从可视化调试器中获取不正确的信息。在gdb控制台中,您可以键入“print-obj currentRow”,它应该为您提供更好的信息。
要确保的一件事是你正在调试一个关闭优化的构建(即Debug,而不是Release,配置),否则代码不会完全映射到编译指令。