Я использую TouchXML для разбора элемента в iOS. Я получаю ответ от веб-службы, используя NSInvocationOperation, затем анализирую и отображаю результаты. Все работает нормально, так как фоновый поток отображает результаты в основном потоке, используя [self performSelectorOnMainThread:@selector(displayLoginresult:) withObject:res waitUntilDone:NO];
, но затем я получаю сообщение об ошибке:
2011-07-18 11:58:06.108 billsApp[873:7107] *** -[CFString release]: message sent to deallocated instance 0x5d809b0
Код для разбора элемента:
-(LoginResult *) tryLogin:(NSString *)userName withPassword:(NSString*)password{
NSURL *url = [UrlUtility TryLogin:userName passwordHash:password];
CXMLDocument *responseObj = [UrlUtility xmlDocWithUrl:url];
if(responseObj == [NSNull null])
return [NSNull null];
CXMLElement *eleUser = [responseObj nodeForXPath:@"//User" error:nil];
CXMLElement *eleResult = [responseObj nodeForXPath:@"//Result" error:nil];
LoginResultType resultType;
//NSLog(@"Result: ");
//NSLog(eleResult );
// NSLog([[eleResult stringValue] lowercaseString]);
if ([[[eleResult stringValue] lowercaseString ] isEqualToString: @"successful"]){
resultType = Successful;
} else {
resultType = InvalidUsernameOrPassword;
}
LoginResult *res = [[LoginResult alloc] init];
res.result = resultType;
for (CXMLElement *resultElement in [responseObj children] ) {
NSLog([NSString stringWithFormat:@"%@ %@", [resultElement name], [resultElement stringValue]]);
}
//todo: fix enum parsing =[LoginResult loginResultTypeStringToEnum: [eleResult stringValue]];
if(eleUser != nil) {
CXMLElement *eleClientID = [eleUser nodeForXPath:@"ClientID" error:nil];
CXMLElement *eleCompanyName = [eleUser nodeForXPath:@"CompanyName" error:nil];
CXMLElement *eleCompanyContact = [eleUser nodeForXPath:@"CompanyContact" error:nil];
CXMLElement *eleIsAgent = [eleUser nodeForXPath:@"IsAgent" error:nil];
CXMLElement *eleParentID = [eleUser nodeForXPath:@"ParentID" error:nil];
NSInteger *clientId = [[eleClientID stringValue] integerValue];
NSString *companyName = [eleCompanyName stringValue];
NSString *companyContact = [eleCompanyContact stringValue];
bool isAgent = [Utils stringToBool:[eleIsAgent stringValue]];
NSInteger *parentId = [[eleParentID stringValue] integerValue];
User *user = [[User alloc] initWithData:clientId companyName:companyName companyContact:companyContact isAgent:isAgent parentId:parentId];
res.user = user;
// release elements
// [eleClientID release];
// [eleCompanyName release];
// [eleCompanyContact release];
// [eleIsAgent release];
// [eleParentID release];
//release raw values
// [companyName release];
// [companyContact release];
}
// [eleResult release];
// [eleUser release];
return res;
}
Часть меня хочет сказать, что это ошибка в TouchXML, но я нахожу это очень маловероятным. Можно ли как-то отследить ошибку?
РЕДАКТИРОВАТЬ: определения свойств в классе User:
@property (nonatomic, readwrite) NSInteger clientId;
@property (nonatomic, retain) NSString *companyName;
@property (nonatomic, retain) NSString *companyContact;
@property (nonatomic, readwrite) bool isAgent;
@property (nonatomic, readwrite) NSInteger parentId;
И экземпляр инициализируется с помощью:
-(User*)initWithData:(NSInteger *)clientId companyName:(NSString *)company companyContact:(NSString*)contact isAgent:(bool)agent parentId:(NSInteger*)parentId {
//[self = super init];
self.clientId= clientId;
self.companyName= company;
self.companyContact= contact;
self.isAgent = agent;
self.parentId = parentId;
return self;
}
И класс LoginResult:
@interface LoginResult : NSObject {
LoginResultType result;
User *user;
NSString * const loginResultTypeArray[4];
}
@property (nonatomic, readwrite) LoginResultType result;
@property (nonatomic, retain) User *user;