NSString stringWithFormat, вызывающая сбой приложения iPhone - PullRequest
0 голосов
/ 11 апреля 2011

Когда я создаю динамический URL-адрес с помощью NSString stringWithFormat, а затем использую это значение в моем анализаторе XML, я получаю случайные сбои.Однако, если я протестирую его с константной строкой, он будет работать нормально ...

Это мой код для генерации строки,

loginURL = [NSString stringWithFormat:@"%@%@",ScriptURLString,@"authenticate"];

Что приводит к

http://edms.digistorm.com.au/test/index.php?s=&sc=D41D8CD98F00B204E9800998ECF8427E&m=authenticate

Затем я использую его в своем анализаторе XML,

XMLReturnData = [[NSMutableArray alloc] init];
xml = [[XMLParser alloc] 
       initWithXMLPath:loginURL 
       lookForElement:@"Authenticate" 
       setCallbackObject:self 
       withSelector:@selector(dataReady) 
       data:XMLReturnData
       ];

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

loginURL = @"http://edms.digistorm.com.au/test/index.php?s=&sc=D41D8CD98F00B204E9800998ECF8427E&m=authenticate";

, она работает нормально ...

loginURL определяется как NSString * loginURL;в моем заголовочном файле для этого представления.

Любая помощь или руководство будет высоко ценится!

Спасибо, Тим

Ответы [ 4 ]

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

Метод, который вы используете для выделения строки, важен.

У вас есть два основных способа размещения вашей строки:

NSString *loginURL = [[NSString alloc] initWithFormat:@"%@authenticate", ScriptURLString];

По сравнению с:

NSString *loginURL = [NSString stringWithFormat:@"%@authenticate", ScriptURLString];

Во-первых, в соглашениях о Какао говорится, что, поскольку вы создали объект с помощью сообщения alloc, вы «владеете» им и несете ответственность за его освобождение.

Для последнего соглашение состоит в том, что, поскольку вы создали объект, созданный методом «удобства» класса, вы НЕ являетесь его владельцем и не несете ответственности за его освобождение. Класс (здесь NSString) несет ту ответственность, которую он будет выполнять через пул авто-релиза.

Подводя итог, можно сказать, что когда вы явно создаете что-то с помощью alloc / init, вы должны его освободить. При использовании метода стиля [NSThing thingWithXXX] вы не должны этого делать.

0 голосов
/ 11 апреля 2011

Это показывает, что ваша строка освобождается, и когда вы вызываете ее в синтаксическом анализаторе XML, происходит сбой приложения.

на самом деле stringWithForma t дает autorelease объект для строки.

Итакчто вам нужно, сделайте вашу строку как свойство retain внутри .h, затем синтезируйте ее в .m и освободите ее в методе dealloc.

, а также сделайте это,

в viewDidLoad

NSString *tempString=[[NSString alloc] init];  //using this because your string is retain type so it prevent increment in retain count.
self.loginURL=tempString;
[tempString release];

Теперь, когда вы используете stringWithFormat, используйте вот так

self.loginURL = [[NSString stringWithFormat:@"%@%@",ScriptURLString,@"authenticate"] retain];

Это решит вашу проблему.

0 голосов
/ 11 апреля 2011

Не звонить release на loginURL, потому что вы не разрешили его и только iOS имеет право уничтожить его ...

Используйте код ниже

loginURL = [[NSString alloc] initWithFormat:@"%@%@",ScriptURLString,@"authenticate"];

Как только вы использовали loginURL Не забудьте позвонить release на него ...

   [loginURL release];
0 голосов
/ 11 апреля 2011

Попробуйте, это может вам помочь.

loginURL = [NSString stringWithFormat:@"%@authenticate",ScriptURLString];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...