2011-03-02 2 views
0

나는 CategoryViewController라는 클래스를하고있는 viewDidLoad 메서드는이 메서드를 호출 여기에 대부분의 경우 범주에서이 릴리스 호출로 인해 계측기가 충돌합니까?

- (void)reset { 
    Category * c = [[Category alloc] initWithId:0 title:@"Categories"]; 
    [self setCategory:c]; 
    [c release]; // <--- line of code I am interested in 
    self.title = @"Categories"; 
    [self fillCategory]; 
} 

가 null이 될 것이다, 그러나 때때로 카테고리가 할당 된 후에 호출 할 필요를 재설정합니다. 코드에 표시된 라인이 없으면 프로그램이 빌드되고 디버그됩니다. 장비를 가져 와서 누수를 확인할 수 있습니다. 내가 발견 할 수있는 유일한 누수는이 함수에서 초기화 된 카테고리입니다 (릴리스가 없기 때문에 이미 초기화 된 CategoryViewController에서이 함수를 호출 할 때 누수가 발생하기 때문입니다).

c에서 릴리스와 함께이 방법을 실행하려고하면 Instrument, XCode 및 Simulator가 모두 이상하게 작동하여 충돌 및 정지되어 임의의 SIGABRT 및 SIGKILL이 발생합니다. 거기에 코드 줄을 빌드하고 디버깅 할 수 있지만 Instruments는 내 앱을 시작하지 않습니다. 아무도 여기에 무슨 일이 일어나고 있는지에 대한 힌트를 줄 수 있습니까?

편집 : 귀하의 재산을 가정하면 아래와 같이 선언

@implementation Category 
@synthesize title, articleCount, seeAlso, categoryId, articles, subcategories; 

- (id)initWithId:(NSInteger)cid title:(NSString*)t{ 
    self.title = t; 
    self.categoryId = cid; 
    [self setArticles:[[NSMutableArray alloc] init]]; 
    [self setSubcategories:[[NSMutableArray alloc] init]]; 
    [self setSeeAlso:[[NSMutableArray alloc] init]]; 
    self.articleCount = 0; 
    return self; 
} 
+1

, 그것은 우리가 가진 버그를 진단 할 수 있습니다, 잘 작동합니다 어떤 당신이 우리에게주었습니다. 우리는'initWithId : title :'과'setCategory :'뒤에있는 코드를 볼 필요가있다. – Chuck

+0

'category'에'@ property'가 어떻게 선언되어 있습니까? –

+1

'category'는 유지 된 속성입니까? 만약 그렇다면, 당신은 Apple setter setCategory를 자신의 메서드로 오버 라이딩합니까? 그렇다면 그 메소드 안에 전달 된 category 객체를 유지해야 할 것입니다. 여기 어둠 속에서 촬영하는 것만으로는 주어진 정보로 인해 충돌을 일으키는 원인을 알 수 없습니다. – Anurag

답변

1

온라인으로 게시하는 데 시간이 걸리면 이러한 일이 너무 쉽게 해결되는 것처럼 보입니다. 카테고리 초기화 코드를 게시 한 후에 내가 만든 할당을 제대로 공개하지 않는다는 것을 깨달았습니다. 내 누수뿐만 아니라 내 충돌과 같이 적절한 메모리 관리 후 간을 한 것으로 나타났습니다 :이 코드 주위에 간단한 더미 클래스를 만드는 경우

- (id)initWithId:(NSInteger)cid title:(NSString*)t{ 
    self.title = t; 
    self.categoryId = cid; 
    NSMutableArray * m = [[NSMutableArray alloc] init]; 
    [self setArticles:m]; 
    [m release]; 
    m = [[NSMutableArray alloc] init]; 
    [self setSubcategories:m]; 
    [m release]; 
    m = [[NSMutableArray alloc] init]; 
    [self setSeeAlso:m]; 
    [m release]; 
    self.articleCount = 0; 
    return self; 
} 
+0

나는 여전히 겉으로보기에는 관계없는 코드 라인이 설명없이 시작될 때 악기가 충돌 할 수 있다고 생각합니다. – Tozar

0

더 코드, 당신이 강조 라인에 문제를 참조하거나 코드의 나머지 부분과하지 않습니다

@property (retain) Category *c; 

어둠 속에서 그냥 쏘지 만 Xcode, Instruments 및 Simulator는 미친듯한 일을했습니다. 무한 재귀가있었습니다.

fillCategory의 방법으로 viewDidLoad 또는 reset 메서드를 호출하지 않았습니까?
reset 메서드의 첫 번째 줄에 중단 점을 설정하고 코드를 단계별로 수행하면 어떻게됩니까?

관련 문제