2012-01-19 4 views
2

객관적인 C 프로그래밍을 처음 접했고 메소드에서 객체를 만들 때 약간의 문제가 발생합니다. 이 프로그램의 목적은 나중에 그래프 이론을 테스트 할 때 사용할 그래프를 표현하는 방법을 만드는 것입니다.Objective-C 및 힙에 새 객체 생성

문제가 있습니다.

//From GraphObject.m 
-(void) addNode 
{ 
    GraphNode *newNode = [[GraphNode alloc] initWithId:count]; 
    [graphNodes addObject:newNode]; 
    NSLog(@"Node %i added", count); 
    count++; 
} 

이 발췌문은 내 GraphObject 클래스에서 가져온 것이며 프로그램이 중단되는 곳입니다. 블록의 첫 번째 줄에서 중단됩니다. 이 메서드는 GraphNode 개체를 만들어 GraphObject 클래스의 NSMutableArray (graphNodes)에 배치합니다. count 변수는 얼마나 많은 노드가 추가되었는지 간단히 추적합니다. C++에 익숙해 져서 왜 힙에 객체를 넣지 않고 왜 사용하는지 알기가 힘듭니다. Btw. 내 주머니에 넣으면 똑같은 라인이 제대로 작동합니다. 조금 벗어납니다.

누군가 내가 뭘 잘못하고 있는지 설명 할 수 있다면 크게 감사하겠습니다.

편집 : 다음은 initWithId 메소드입니다. 그 원인이 여기 있을지도 모른다고 생각하기 시작했습니다. 그것은 자기에 대한 포인터를 반환해야합니까?

-(id) initWithId:(int)n 
{ 
    nodeId = [NSNumber numberWithInt:n]; 
    neighbourNodes = [NSMutableArray arrayWithCapacity:8]; 
    return self; 
} 

메모리 누수는 (yAak)을 언급하고, 나는이 방법에서 GraphNode 배열의 창조에 관하여 있으리라 믿고있어. 하지만 배열을 삭제할 때 해결되지 않을까요? 같은 방법으로 삭제하면 아무것도 보이지 않습니다. 또한, xcode를 처음 사용하는 중에 오류 메시지를 게시하지 않아서 죄송합니다. 빌드가 성공적으로 완료되었으며 코드의 특정 줄에 프로그램이 멈췄다 고합니다.

EDIT2 (솔루션) : 음, 이상한 놀람이 있습니다. 코드를 제거/자르고 프로그램을 한 번 실행 한 다음 똑같은 코드를 다시 붙여 넣었습니다. 이제 제대로 작동합니다. 바로 거기에 하나의 안정적인 IDE가 있습니다. 대답에 다시 한번 감사 드리며, 나는 곧 여기로 돌아올 것이라고 확신한다.

+3

중단되면 오류가 게시됩니다. 여기 내가 잘못 본 것은 휴식을 초래하지 않을 잠재적 인 메모리 누수입니다. – MechEthan

+2

- [GraphNode initWithId :]의 구현을 게시 할 수 있습니까? 또한 표시되는 오류 메시지를 게시하십시오. 잘못된 코드로 게시 한 코드에 대해서는 아무 것도 없습니다. –

+0

요청에 따라 업데이트 됨. – user1159690

답변

2

귀하의 초기화 :

-(id) initWithId:(int)n 
{ 
    nodeId = [NSNumber numberWithInt:n]; 
    neighbourNodes = [NSMutableArray arrayWithCapacity:8]; 
    return self; 
} 

은 다음과 같아야합니다

- (id)initWithId:(int)n 
{ 
    self = [super init]; /* << or whatever the designated initializer of the superclass is */ 
    if (nil != self) { 
     nodeId = [[NSNumber alloc] initWithInt:n]; 
     neighbourNodes = [[NSMutableArray alloc] initWithCapacity:8]; 
    } 
    return self; 
} 

지금까지 힙으로 잘 당신이 작성하는 모든 NSObject의 인스턴스가 참조 카운트 힙에 있습니다. Clang은 심지어 스택 (GCC)에서 objc 객체를 만들지도 못합니다.

힙이 엉망이거나 개체 또는 구성원이 조기에 해제되었다고 생각하면 메모리/심판 카운트 진단 도구가 많이 있습니다 : 좀비는 하나, GuardMalloc 및 낙서는 다른 것입니다. 물론 누수도 좋은 수표입니다.

+0

감사합니다.이 문제도 해결할 것입니다. – user1159690

0

누수, NSZombies 등은 모두 유용한 도구입니다. 그러나 특히 (당신이하지 않은 경우에도 때로는)이 언어에 새로운있을 때,이 같은 메모리 관리 문제를 해결하는 가장 좋은 방법은 다음과 같습니다

1)이 읽기 : http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

2)보고 귀하의 코드를 다시.

3)이를 다시 읽어 : http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

당신의 NSNumber 객체의 소유권을하지 않은 당신 때문에이 경우

은, 그것은의 다음주기 전에 할당이 해제 된 [... 등] 응용 프로그램의 실행 루프

응용 프로그램의 runloop 밖에 있었고 autorelease 풀이 없었기 때문에 메인에서 이런 일이 발생하지 않았습니다. autorelease 풀이 없어서 누출 된 것으로 콘솔 메시지가 표시됩니다. 그것이 무엇인지 확실하지 않다면, 링크 된 문서의 autorelease 풀에 관한 섹션을 읽으십시오.