Цель C и NSMutableString - PullRequest
       3

Цель C и NSMutableString

1 голос
/ 11 февраля 2011

Заголовочный файл:

@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 ]

4 голосов
/ 11 февраля 2011

Я не знаю, имеет ли это какое-либо отношение к этому, но если вы читаете документацию по методу initWithString:, он возвращает экземпляр подкласса NSString, который может или не может быть экземпляром NSMutableString

Попробуйте вместо этого, он будет делать то, что вы хотите:

currentRow = [@"VehicleYear" mutableCopy];

Кроме того, в 99% случаев вы хотите получить строковое свойство класса, который вы хотите объявить как:

@property(readwrite,copy)NSString *name;

Если вы объявляете свойство строки readwrite как что-либо кроме копии, тогда любой, кто его устанавливает, может изменить свою строку и повлиять на внутреннее состояние вашего объекта, что обычно не то, что вам нужно.Если исходная строка не является изменяемой, то ее метод копирования все равно сохраняет, поэтому производительность не теряется в том случае, если она имеет значение.

Если вы хотите, чтобы внутренняя изменяемая строка не могла быть изменена внешним пользователем, вы, вероятно, захотитеобъявить свойство следующим образом:

@property(readwrite,copy)NSString *name;

И затем самостоятельно реализовать -name и -setName:, чтобы вы могли вызвать -mutableCopy, чтобы установить его, и -copy в получателе, чтобы они не могли изменитьсяваше внутреннее состояние.Я много писал об этом в своем блоге .

Обратите внимание, что

@property(readwrite,copy)NSMutableString *name;

не делает то, что кто-то хочет, когда вы @ синтезируете средства доступа в качестве установщикавызывает -copy и в результате получает NSString, которая не является NSMutableString.

1 голос
/ 11 февраля 2011

Иногда я получаю неверную информацию от визуального отладчика.В консоли gdb вы можете набрать «print-obj currentRow», и она должна дать вам более полную информацию.

Одна вещь, чтобы убедиться, что вы отлаживаете сборку с отключенной оптимизацией (то есть Debugне Release, конфигурация), иначе код не отображается точно на скомпилированные инструкции.

...