2010-07-14 4 views
2

iPhone 앱에서 메모리 누수가 필연적으로 필요합니다. 앱이 앱 스토어에 제출할 준비가되었거나 안정적이며 iPhone 시뮬레이터 나 Clang에서 메모리 누수가 전혀 발생하지 않았지만 내 iPod Touch에서 그 (것)들과 수수께끼로 보입니다.코어 데이터 메모리 누수 - iPhone iOS4

코어 데이터에서 데이터를 검색하려고 할 때 모두 managedObjectModel에서 비롯된 것처럼 보입니다.

내 응용 프로그램의 핵심 데이터 코드가 Xcode에 의해 자동으로 생성되었으므로 xcode가 생성 될 때 코드가 변경된 것을 확인했습니다 ... 이전 버전과 새로운 버전을 시도했지만 아무런 차이가 없습니다.

다음 코드를 주석 처리하면 문제가 사라집니다 ... 어쨌든 문제가있는 것을 볼 수 있습니까? 나는 지금까지 이것에 9 시간을 썼고, 단지 그것을 이해할 수 없다!

NSString *entityForName = [[NSString alloc] initWithString:@"OfflineSettings"]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:entityForName inManagedObjectContext:[self managedObjectContext]]; 
[request setEntity:entity]; 

[entityForName release]; 

NSSortDescriptor *sortById = [[NSSortDescriptor alloc] initWithKey:@"Id" ascending:YES]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortById]]; 
[sortById release]; 

NSError *error; 
NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error. 
    NSLog(@"Error fetching"); 
} 

int intId = -1; 

if ([mutableFetchResults count] == 0) { 
    TTDERROR(@"No id has been saved to offline settings");  
} else {  
    OfflineSettings *offlineSettings = (OfflineSettings *)[mutableFetchResults objectAtIndex:0];   
    intId = [offlineSettings.Id intValue]; 
} 

[mutableFetchResults release]; 
[request release]; 
누설 특별히이 줄 것으로 보인다

:

NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 

..와 [자기 managedObjectContext]에 대한 코드가 도움이 경우에는 다음과 같다 ..

- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

나는 정말 상실감이있다. 그래서 나는 약간의 도움에 너무 감사 할 것이다!

스티븐

+0

어떻게 그 라인이 특별히 누설을 일으키는 지 알 수 없지만 왜 변경 가능한 복사본을 만드나요? 배열을 수정하지 않고 그냥 액세스 한 다음 놓습니다. 또한 iPod에서 누수를 어떻게 감지 하나 시뮬레이터에서는 감지하지 못합니까? – bobDevil

+0

안녕하세요, mutableCopy는 원래 이것을 복사 한 샘플 코드에 있습니다. 나는 그것을 시험해 보았고, 동반 릴리스를 없애 버렸지 만, 도움이되지는 않는다. 악기를 사용하여 iPod에서 누출을 감지하고 있습니다. 고마워, –

답변

1

변경 가능한 사본이 필요하지 않습니다. executeFetchRequest:은 자동 반복 된 정적 배열을 반환하며 배열을 변경하지 않습니다. (나는 계속 이것을보고있다. 어딘가에 있어야한다.) 마찬가지로, entityForName NSString을 만드는 것은 무의미하다. 다른 가능한 오류 원인을 제거하려면 문자열 리터럴을 entityForName:에 넣으십시오.

이들 중 일부는 누출 가능성이있는 소스이지만 어쨌든 제거해야합니다.

대개의 경우 시뮬레이터 나 하드웨어가 아닌 다른 장치에는 문제가있는 경우 오류가 발생한 하드웨어에 적합하게 컴파일되지 않은 라이브러리/프레임 워크에 문제가 있습니다. 하나의 환경에서 누출되는 코더 오류 유형은 없지만 다른 환경에서는 누출되지 않습니다. 우리가 실수 할 때, 그것은 보편적입니다.

다른 장치가 다른 그래픽 및 오디오 하드웨어를 사용하기 때문에 이미지 및 사운드와 같은 리소스가 다르게 동작 할 수도 있습니다. 그러나 이것은 드문 경우입니다.

인스 트루먼트를 통해 코드를 실행하면 어떤 객체가 새고 있는지 정확하게 알려야합니다.

+0

나는'mutableCopy' 물건도보고있다. 바라건대 우리 중 하나가 소스를 추적 할 것입니다. 왜냐하면 내가 계속 볼 수있는 캐스팅만큼 바보 같기 때문입니다. –

+0

좋아, 고마워 TechZen ... 그건 내가 좋아하는 충고 다. 즉 "한 환경에서만 누출되는 코더 오류 유형은 없지만 다른 유형은 누출되지 않습니다.실수를하면 범용이됩니다. " 내 논리가 시뮬레이터에서 메모리 누수없이 작동하므로 코딩 실수는하지 않았습니다. 옳고 그른 방향으로 확장 할 수 있습니까? 아이폰/아이팟 장치를위한 프레임 워크를 컴파일하는 방법 ... 그리고/또는 프로젝트에서 사용 된 프레임 워크/라이브러리 중 하나가 잘못 컴파일되었을 때를 감지하는 방법 miunute에서 나의 프로젝트는 좋은 프레임 워크/lib를 사용합니다 다시 한 번 감사합니다 –

+0

아, 악기를 통해 코드를 실행 했으므로 누출 사실을 알고 있습니다 ... 누출 개체 : GeneralBlock4096 책임있는 라이브러리 : 재단,210 책임 프레임 : NSPushAutoreleasePool .. 내가 확장 자세히 보면, 그것은 아래로 리드 : [AppDelegate에 managedObjectContext] [AppDelegate에 persistentStoreCoordinator] [AppDelegate에 managedObjectModel]를 –