2013-06-03 4 views
0
내가 목표 - C를 배우려고 노력하고있어

을 "포인터가 할당되지 않았습니다 해제되지"...목표 C의 메모리 관리 - 오류

I (나는 아주 새로운 해요) 그리고 난 메모리 관리에 문제가 TouchXML을 사용하는 iPad 앱을 개발하고 있습니다.

CXMLDocument를 확장하는 클래스를 만들었으며 일부 내용을 읽고 속성에 저장하여 초기화 작업을 수행했습니다.

@interface SimpleManifest : CXMLDocument { 
    CXMLNode *_defaultOrganization; 
    NSString *_title; 

    NSDictionary *dictionary; 
} 

@property (readonly) CXMLNode *defaultOrganization; 
@property (readonly) NSString* title; 

- (id) initWithPath:(NSString *)path options:(NSUInteger)options error:(NSError **)error; 

@end 

(SimpleManifest.m) : 여기

내 코드 (SimpleManifest.h)는 다른 클래스에 나중에

#import "SimpleManifest.h" 
#import "CXMLNode_XPathExtensions.h" 

@implementation SimpleManifest 

- (id) initWithPath:(NSString *)path options:(NSUInteger)options error:(NSError **)error 
{ 
    /* 
    NSURL *theURL = [[[NSURL alloc] initFileURLWithPath:path] autorelease]; 
    self = [self initWithContentsOfURL:theURL options:options error:error]; 
    */ 

    NSData *data = [NSData dataWithContentsOfFile:path]; 
    NSString *s = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 

    self = [self initWithXMLString:s options:options error:error]; 

    if (self==nil) return nil; 

    // load main props 

    dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
        @"http://www.imsglobal.org/xsd/imscp_v1p1", @"imscp", 
        @"http://ltsc.ieee.org/xsd/LOM", @"lom", nil]; 


    // defualt organization 
    @try { 


     CXMLNode *orgsElem = [[[self childAtIndex:0] nodesForXPath:@"//imscp:organizations" namespaceMappings:dictionary error:nil] objectAtIndex:0]; 
     NSString *xpath = [NSString stringWithFormat:@"//imscp:organization[@identifier='%@']", [[orgsElem attributeForName:@"default"] stringValue]]; 

     _defaultOrganization = [[[self childAtIndex:0] nodesForXPath:xpath namespaceMappings:dictionary error:nil] objectAtIndex:0]; 


     /* 
     NSArray *nodes = [[self childAtIndex:0] nodesForXPath:@"//imscp:organizations" namespaceMappings:dictionary error:nil]; 
     NSString *xpath = [NSString stringWithFormat:@"//imscp:organization[@identifier='%@']", [[[nodes objectAtIndex:0] attributeForName:@"default"] stringValue]]; 
     _defaultOrganization = [[[self childAtIndex:0] nodesForXPath:xpath namespaceMappings:dictionary error:nil] objectAtIndex:0]; 
     */ 

     CXMLNode *titleElem = [[[self childAtIndex:0] 
            nodesForXPath:@"//lom:general/lom:title/lom:string" 
            namespaceMappings:dictionary 
            error:nil] objectAtIndex:0]; 

     _title = [[titleElem stringValue] copy]; 

    } @catch (NSException * e){ 
     self = nil; 
     return nil; 
    } 


    return self; 
} 
@end 

내가 할 :

- (BOOL) isValidSCORMLesson:(NSString*) path { 
    NSString *manifPath = [path stringByAppendingPathComponent:@"imsmanifest.xml"]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath: manifPath isDirectory: NO]) 
     return NO; 

    SimpleManifest *manifest = [[[SimpleManifest alloc] initWithPath:manifPath options:0 error:nil] autorelease]; 
    NSLog(@"%@", manifest.defaultOrganization); 
    NSLog(@"%@", manifest.title); 

    return (manifest!=nil); 
} 

그것을 내가 풀어 낸 포인터의 톤이 할당되지 않았습니다 "오류가 발생했습니다 ... NSLog 호출을 주석으로 처리하면 변경됩니다. manifest.title 속성을 위에서 로깅하거나 그냥 로깅하십시오. 프로젝트에서 ARC를 사용하지 않으므로 메모리 관리에 문제가 있음을 확신합니다.

내가 잘못하고있는 부분을 누군가 도와 줄 수 있습니까? 감사!

+0

할당하지 않은 포인터 변수를 해제하려고합니다. –

+0

dealloc 또는 해제 할 위치를 표시 할 수있는 경우 –

답변

5

malloc 오류를 일으킬 수있는 코드에는 아무런 문제가 없습니다. 가장 좋은 추측은 CXMLDocument 클래스/라이브러리에 버그가 있거나 사용하는 방식에 실수가 있다는 것입니다.

"해제 된 포인터가 할당되지 않았습니다"는 것은 처음에 할당되지 않은 메모리 조각에 대한 포인터에 free() (또는 dealloc)을 호출 한 사용자를 의미합니다. 보통 당신이 설정할 수있는 breakpoint를 제공합니다. 그러면 breakpoint가 정확히 어디에 발생했는지에 대한 backtrace를 줄 것입니다.

일부 의견 :

(1) @/시도하는 방식으로 @ 캐치하지 마십시오. 그냥 잡아 두지 마세요. 사용중인 패턴은 오류를 숨 깁니다. 예외는 iOS/Cocoa에서 복구 할 수 없습니다.

(2) 파일에서 직접 NSString 인스턴스를 만들 수 있습니다. 먼저 NSData을 통해로드 할 필요가 없습니다.

(3) ARC를 사용해야합니다.

+2

+1 3. 가장 좋아하는 것 : –

+0

@bbum : ivars 및 속성을 사용하는 경우, 예를 들어 iVars (NSString * _title ...) . 우리는 속성을 사용하는 것을 선호해야합니까 아니면 동일한 것입니다. 감사합니다 – samir

+0

답변을 주셔서 감사합니다 ... 그 시간에, 나는 그것을 발견하여 "@ 속성 (읽기 전용) NSString * 제목;" "@ 속성 (읽기 전용) NSString * 제목;" (제목 옆에있는 별표를 움직이면) 오류가 발생하지 않았습니다. 그런 다음 다른 노드를 읽은 후에 오류가 다시 발생하고 프로젝트를 정리하고 다시 빌드하면 오류 메시지가 다시 중지된다는 것을 알았습니다 ... 혼란 스럽습니다. – lviggiani