Objective-C пространства в строках - PullRequest
1 голос
/ 21 июля 2011

У меня есть объект с именем exampleObject с двумя строковыми свойствами: moduleName и pool.

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

Оба они установлены с использованием двух текстовых полей с именами moduleNameField и poolField соответственно, когда IBAction запускается:

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», он не потерпел бы крах.

Любое понимание этого было бы очень полезно!

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Звучит как проблема с памятью, и ваши свойства NSString* установлены для назначения. Я рекомендую установить для них значение copy или, по крайней мере, retain и убедиться, что вы освободили их в методе dealloc. Так как они настроены на передачу сообщений, любой из них может вызвать сбой в любое время, в данном случае это просто pool.

1 голос
/ 21 июля 2011

Следуя правилам управления памятью какао , такие методы, как -text, возвращают экземпляр, который вам не принадлежит.

Если вы хотите сохранить их вокруг, вам нужно вступить во владение, предпочтительно используя свойство copy (чтобы также избежать проблем при передаче изменяемой строки) вместо assign:

@property (nonatomic, copy) NSString *moduleName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...