Objective C和NSMutableString

时间:2011-02-11 16:08:53

标签: objective-c instantiation nsmutablestring

标题文件:

@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而不是实际的内存引用。 无论我做什么,我都无法在此属性中获得有效字符串,因此我的所有比较都失败了。我做错了什么?

2 个答案:

答案 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,配置),否则代码不会完全映射到编译指令。