0

NSXMLParser 인스턴스를 사용합니다. NSMutableDictionary에 저장된 NSMutableStrings에 발견 된 문자를 저장하고 이러한 Dicts는 NSMutableArray에 추가됩니다.NULL 값 전달

이 모든 것이 정상적으로 보일 때 : 1 배열, x 사전 및 x 문자열을 계산합니다.

detailview 컨트롤러 파일에서 구문 분석 결과를 표시하고 싶습니다. 모든 것을 저장하는 클래스를 호출하지만 null이 반환됩니다.

이다 나는 (잘못) 무엇을 :

내 컨트롤러 파일에서
xAppDelegate.h 

@interface xAppDelegate : NSObject <UIApplicationDelegate> {  
    UIWindow *window; 
    UINavigationController *navigationController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

xAppDelegate.m 

#import "xAppDelegate.h" 
#import "RootViewController.h" 
#import "XMLParser.h" 

@implementation xAppDelegate 
@synthesize window, navigationController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // OFFLINE DOCUMENT > Resources folder 
    NSString *Path = [[NSBundle mainBundle] bundlePath]; 
    NSString *DataPath = [Path stringByAppendingPathComponent:@"file.xml"]; 
    NSData *Data = [[NSData alloc] initWithContentsOfFile:DataPath]; 

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:Data];  

    XMLParser *parser = [[XMLParser alloc] initXMLParser]; 

    [xmlParser setDelegate:parser]; 
    [xmlParser setShouldProcessNamespaces:NO]; 
    [xmlParser setShouldReportNamespacePrefixes:NO]; 
    [xmlParser setShouldResolveExternalEntities:NO]; 

    [xmlParser parse];  

    [window addSubview: navigationController.view]; 
    [window makeKeyAndVisible]; 
} 

- (void)dealloc { 
    [window release]; 
    [navigationController release]; 
    [super dealloc]; 
} 
@end 

    XMLParser.h 
@class xAppDelegate; 

    @interface XMLParser : NSObject { 
     NSMutableArray *array; 
     NSMUtableDictionary *dictionary; 
     NSSMutabletring *element; 
xAppDelegate *appDelegate; 
    } 
- (XMLParser *) initXMLParser; 
    @property (nonatomic, retain) NSMutableArray *array; 
    @property (nonatomic, retain) NSMutableDictionary *dictionary; 
    @property (nonatomic, retain) NSMutableString *element; 


    XMLParser.m 
#import "xAppDelegate.h" 
#import "XMLParser.h" 

    @synthesize array, dictionary, element; 
- (XMLParser *) initXMLParser { 
[super init]; 
appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate]; 

return self;  
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    array = [[NSMutableArray alloc] init]; 
     dictionary = [[NSMutableDictionary alloc] init]; 
} 

    - (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict 
{ 
    ele = [elementName copy]; 
    if ([elementName isEqualToString:@"CONTAINER"]) { 
     element = [[NSMutableString alloc] init]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser 
foundCharacters:(NSMutableString *)string 
{ 
    if ([ele isEqualToString:@"ELEMENTNAME"]) { 
     [element appendString:string]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"CONTAINER"]) { 
     [dictionary setObject:element forKey:@"ELEMENTNAME"]; 
     [array addObject:[dictionary copy]]; 
     } 
} 
- (void) dealloc { 
[element release]; 
[dictionary release]; 
[array release]; 
} 

나는이 작업을 수행 :

controller.h 
@class XMLParser; 

@interface controller : UIViewController { 
XMLParser *aXMLParser; 
} 

@property (nonatomic, retain) XMLParser *aXMLParser; 

controller.m 
#import "XMLParser.h" 

@synthesize aXMLParser; 

- (void)viewDidLoad { 
    NSLog(@"test array: %@", aXMLParser.array); 
    NSLog(@"test dict: %@", aXMLParser.dictionary); 
    NSLog(@"test element: %@", aXMLParser.element); 
} 

내 배열의 값, 딕셔너리 또는 요소를 테스트 할 때 내 결과를 얻을 XMLParser.h 파일. 컨트롤러 파일에서 내 결과를 호출 할 수 없기 때문에 내가 뭘 잘못하고 있니? 저는 지금 당장 붙어있어서 도움이됩니다./

+0

이것은 Objective-C입니다. – BobbyShaftoe

+0

BobbyShaftoe를 알아 줘서 고마워. – FFXIII

답변

0

아마도 NSMutableString 요소를 초기화하지 않았기 때문에 아마도 nil 개체에 메시지를 보내고있을 것입니다.

중요한 코드를 게시하지 않았으므로 추측입니다. 당신이

  • 당신이 그들을 예를 들어, 지정 곳에 세 개의 객체를 초기화 여기서 우리는

    • 를 볼 필요가 그것을 깨닫지 않고 그 중 하나에 nil을 할당 할 수 있습니다.

    편집 코드의 최신 비트 다음 코드를 잘못 꽤 많이있다, 예를 들어, 개체의 많은 누수,하지만 난 당신의 특정 문제를 야기 할 수있는 모든 작업을 볼 수 없습니다

    , ELEMENTNAME 요소가 XML의 CONTAINER 요소 내에 나타나지 않는 한.

    저는 iPhone의 사용자 인터페이스 코드에 대한 전문 지식이 없지만 applicationDidFinishLaunching은 을 실행하기 전에 viewDidLoad 전에 실행합니까?

    또한 파서를 aXMLParser 속성에 할당하지 않은 것처럼 보입니다.

    귀하의 NSXMLParser 누출 당신이 그것을 공개하지 않기 때문에 다른 문제

    의 일부.

    파서도 같은 이유로 누출됩니다 (로컬 정의 된 것이 아니라 XMLParser를 사용하려는 경우 일 수 있습니다).

    - (XMLParser *) initXMLParser { 
        self = [super init]; 
        if (self != nil) 
        { 
         appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate]; 
        } 
    
        return self;  
    } 
    

    즉 [슈퍼 초기화]의 결과를 버리고이 전무하지 있는지 확인하지 않습니다처럼

    귀하의 initXMPLarser 방법을 찾아야한다.

    배열은 새로운 요소를 칠 때마다 할당됩니다. 각 요소가 새로운 요소를 치면, 마지막 요소에서 이전 배열을 버리고 유출합니다.

    사전은 CONTAINER 요소에 도달 할 때마다 할당됩니다. 새 것을 할당하기 전에 이전 버전을 릴리스해야합니다.

    요소도 누출됩니다.

    배열에 넣은 사전 복사본도 새어 나옵니다. Objective-C 컬렉션은 요소를 유지합니다.

  • +0

    문자열 중 하나가 할당되지 않으면 아무 것도 작동하지 않습니까? 공백과 새 줄 등이 많지만 foundIgnorableWhitespace 함수가 자동으로 처리하지 않습니까? 대답을위한 Thx – FFXIII

    +0

    @ FFXIII : 새 코드를 포함하도록 질문을 편집 할 수 있습니까? 서식을 더 명확하게 만듭니다. foundIgnorableWhateSpace에 대해 확실하지 않습니다 : 요소의 공간을 무시할 수있는 모든 것이 아닙니다. – JeremyP

    +0

    그래서 실제로 XML 파서로 구문 분석 작업을 호출하고 있습니까? – JeremyP