Очистка переменной NSString, созданной из ответа HTTP - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть ответ JSON, который я преобразую в NSDictionary, который выглядит следующим образом

 response {
    cid = 30;
    female =     {
        id = 24;
        "img_url" = "/static/images/upload/24";
    };
    male =     {
        id = 26;
        "img_url" = "/static/images/upload/26";
    };
}

Затем я извлекаю код cid, подключая его к переменной NSString следующим образом:

cid = [response objectForKey:@"cid"]; 

Позже в другом методе я пытаюсь использовать cid в ASIFormDataRequest

[request setPostValue:cid forKey:@"cid"];

но это приводит к сбою программы. Если я помещу cid = @"7" (например) прямо перед этим оператором setPostValue: cid, все работает нормально, поэтому я знаю, что функциональность запроса в порядке. Аналогично, если я NSLog(@"%@",cid);, это также работает.

Я считаю, что мой вопрос идентичен этому , но никто не дал конкретного ответа относительно того, как его решить.

Есть идеи?

РЕДАКТИРОВАТЬ 1

Нет журнала сбоев. Xcode просто дает мне это сообщение в нижней панели:

enter image description here

** РЕДАКТИРОВАТЬ 2 **

Вот некоторые мои изображения, распечатанные с помощью отладчика. Я не знаю, правильно ли я это сделал, хотя.

enter image description here

Вот как я вставляю данные ответов в CID. CID - это строка NSString, объявленная в заголовочном файле с целым битом @property (nonatomic, retain).

enter image description here

РЕДАКТИРОВАТЬ 3

Также, если я печатаю

NSLog(@"%@", cid);

прямо перед публикацией значения cid я получаю сообщение об ошибке EXC_BAC ACCESS

Ответы [ 2 ]

3 голосов
/ 11 сентября 2011

CID - это строка NSString, объявленная в заголовочном файле со всем битом @property (неатомный, сохраняемый).

Даже если вы объявили его как сохраняемое свойство, вы не используете его как свойство. Используя:

cid = [number stringValue];

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

Если вас интересует объект, который должен выжить при сливе из авто-релизного пула, вы должны стать его владельцем. С сохранением свойств это означает вызов установщика свойства, например ::

self.cid = [number stringValue];

Это сохранит [number stringValue], присвоенный свойству cid, и, если все остальное в вашей программе правильно в отношении управления памятью, вы сможете использовать self.cid в других частях вашей программы, как в:

Позже в другом методе я пытаюсь использовать cid в ASIFormDataRequest

Для записи свойства NSString обычно копируются, а не сохраняются, чтобы предотвратить побочные эффекты, когда свойству присваивается изменяемая строка.

0 голосов
/ 11 сентября 2011

Когда вы берете cid следующим образом: cid = [response objectForKey: @ "cid"]; затем он возвращает объект автоматического выпуска. Это будет выпущено, когда метод вернется. Поэтому попробуйте использовать alloc.

if(cid != nil)<br> [cid release];<br> cid = [[NSString alloc] initWithString:[response objectForKey:@"cid"]];

, а затем

[request setPostValue:cid forKey:@"cid"];

Если это не решит вашу проблему, напишите здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...