Я - новичок на мире разработки iPhone..
Я запустил новый проект, я использовал его для тестирования то, что я узнал о цели c, он в основном отправляет и получает данные из моего локального сервера, затем, я храню некоторые из тех данных в классе, он хорошо работает. Все находится на командной строке.
мое определение класса:
@interface MyClient : NSObject {
NSString *name;
NSMutableDictionary *in, *out;
}
-(BOOL) send;
-(BOOL) receive;
Я настроил значения, преобразовываю их в xml и отправляю их на свой сервер. мой сервер отвечает, я добираюсь "в" значениях, имя является строкой, которая содержит некоторое специальное значение "в" значениях.
Проблема возникает, когда я пытаюсь смешать свой код с некоторым примером/демонстрацией, я нашел в Интернете, демонстрация приносит некоторый MVC?? файлы (*Handler.h/m, *ViewController.h/m, *AppDelegate.h/m). Существует одна кнопка (btnStart), если я нажимаю ту кнопку, она звонит
- (IBAction) start: (id) sender;
все хорошо работает, если я поместил отправление и получаю вызовы в методе запуска.
НО...
Я попробовал два, имеют к кнопкам: отправьте и получите, обе работы (я судил их и отправку вывода к консоли), оба метода:
1) - (IBAction) send: (id) sender;
2) - (IBAction) receive: (id) sender;
обе внутренней части *Handler.m
затем: метод 1) будет просто работать [myClient, отправляют]; метод 2) будет просто работать [myClient, получают];
это не работает, это бросает меня ошибка "BAD_ACCESS", я отладил (я использовал NSZombie..)...
Я нашел, что данные, которые хранятся (в, имя), когда назван [myClient, отправляют], released/killed/does не, существуют при вызове [myClient получают]
Я не назвал [myClient выпуск] или что-то как этот.
вопросы: что я делаю неправильно? где это должно кодировать (метод 1) и 2)) быть?
спасибо.
ОБНОВЛЕННЫЙ: Вот некоторый код, это огромно, таким образом, я имею копию и вставил свидетельствующую часть, сообщите мне, нужно ли Вам больше кода, Спасибо!
// MyClass.h
@interface MyClient : NSObject {
NSString *name;
NSString *id;
NSMutableDictionary *paramIn, *paramOut;
}
-(BOOL) send;
-(BOOL) receive;
-(void) setParam:(NSString *) key value: (NSString *) value;
-(NSString *) getParam:(NSString *) key;
//MyClass.m
#import "MyClass.h"
#import "TBXML.h"
@implementation MyClass
-(id) init {
if ( !(self= [super init]) ){
return nil;
}
paramIn=[[NSMutableDictionary alloc] init] ;
paramOut=[[NSMutableDictionary alloc] init] ;
return self;
}
-(void) setParam:(NSString *) key value: (NSString *) value {
[paramOut setObject:value forKey:key];
}
-(NSString *) getParam:(NSString *) key {
return [paramIn objectForKey:key];
}
-(BOOL) send{
NSString *xml=[self getXML];
// url conection ...
// NSURLReq ...
NSData *data= [ buffer dataUsingEncoding: NSASCIIStringEncoding];
TBXML * tbxml = [[TBXML tbxmlWithXMLData: data] retain];
BOOL r=[self getXML: tbxml usingThisDictionary: ¶mIn];
if (r == YES) {
name = [self getParam:@"nameResponse"];
id =[self getParam:@"myId"];
}
[xml release];
[data release];
[tbxml release];
return r;
}
-(BOOL) getXML:(TBXMLElement *)element usingThisDictionary:(NSMutableDictionary **) map {
// search for each element...
if (someError) return NO;
[*map setObject: [TBXML attributeValue:attribute] forKey:[TBXML elementName:element]];
return YES;
}
@end
ОБНОВЛЕННЫЙ: Спасибо парни (IwasRobbed, Simon, TechZen)
Я отлаживал и изменял код... Я нашел что: для поддержания имени имени и значения идентификатора, я должен сделать:
name =[[self getParam:@"nameResponse"] copy];
id =[[self getParam:@"myId"] copy];
вопросы: Q1. разговор о старом коде (whitout copy
), name
и id
значение выпущено потому что
1) это выслежено к paramIn
словарь, и paramId
выпущен?
ИЛИ
2) оба значения копируются с paramIn
словарь, но существует, не сохраняют/копируют инструкцию
Я думал, ответ 2), правильно?
Q2. как я могу сохранить значения, сохраненные в NSMutableDictionaries paramIn
и paramOut
?
спасибо
Если вы не разместили или не сохранили рассматриваемый объект (строку?), И он был передан вам другим методом, он, вероятно, автоматически выпущен. Насколько я понимаю, объект сохраняется только до тех пор, пока не будет выпущен пул автозапуска (в конце текущего цикла выполнения?). Это вызовет вызовы send:
и receive:
в одном и том же цикле (при вызове их в одной функции), но при вызове по отдельности вызовет ошибку, поскольку объект имеет были выпущены автоматически.
Ваши переменные экземпляра name
, in
и out
не определены как свойства, поэтому вы должны микроконтролировать их сохранение. Если этого не сделать, то они не выживут долго за пределами метода, в котором вы их задали.
Самое простое решение - сделать свойства переменных экземпляра следующим образом:
@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSMutableDictionary *in;
@property(nonatomic, retain) NSMutableDictionary *out;
... и затем использовать нотацию self, например, self.name
для доступа к ним.