2012-03-29 1 views
0

지난 몇 시간 동안 objective-C의 메모리 관리 주제에 대한 수십 개의 게시물을 검색 한 결과이를 얻지 못했습니다. 죄송합니다. 나는 최선을 다하고있다!executeFetchRequest를 사용하여 객체를 반환하는 메서드

'executeFetchRequest'를 호출하는 메소드에서 객체를 반환하는 방법에 대한 답을 찾고 있습니다. 여기

은 ...

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index 
{ 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// Set filter predicate 
NSString *strFilter = [NSString stringWithFormat:@"%@ = %d", name, index]; 
[request setPredicate:[NSPredicate predicateWithFormat:strFilter]]; 

// Create the sort descriptors array 
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:name ascending:YES]; 
[request setSortDescriptors:[NSArray arrayWithObject:sorter]]; 

NSError *error = nil; 
Player *player = nil; 
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error]; 
if ([array count] == 1) 
{ 
    player = [array objectAtIndex:0]; 
    //[player retain]; // ??? 
} 

[request release]; 

return player; 
} 

일부 코드입니다하지만 정말 필요한 것은 메소드가 리턴 한 후 곁에있는 "플레이어"개체입니다.

'플레이어'가 반환 된 후 어떻게 살 수 있습니까?

'보유'라고해야하나요? (그리고 수신기에서 'release'라고 부름) 객체를 복사해야합니까?

나는 다음에서 이해를 도출 할 수 있도록

난 그냥 간단한 예를 필요로 등 ALLOC, 복사, 새에 대한 다른 모든 게시물을 읽어 보시기 바랍니다. 이 메서드를 호출하는 리시버의 예를 보여 주면 감사하겠습니다.

감사합니다.

답변

1

복사 할 수는 있지만 Player 클래스는 NSCopying 프로토콜을 준수해야합니다.

if ([array count] == 1) 
{ 
    player = [[array objectAtIndex:0] retain]; 
} 

[request release]; 

return [player autorelease]; 

당신은 그것을 유지하여 그 사이에 릴리스되는 플레이어를 유지하고, 당신이 그것을 반환 할 때 당신은 사용

여기에이 작업을 수행하는 가장 간단한 (그리고 아마도 가장 좋은) 방법

같은입니다 autorelease. 이것은 꼭 필요한 것은 아니지만이 경우 좋은 프로그래밍 습관이라고 생각합니다. 당신의

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index; 

함수 이름 따라서 호출자까지 객체의 메모리 관리를 떠나, 반환되는 객체가 오토 릴리즈되어 OBJ (-C 표준 관행에) 의미하기 때문이다.

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index을 호출하는 클래스에서 반환 된 플레이어를 보유할지 (예 : 보유 속성으로 설정할지) 또는 그대로두고 싶은지 결정해야합니다 (따라서 자동 릴리즈 됨 이 호출이 완료된 후에 해제 될 가능성이 있습니다. 즉시 몇 가지 작업 만 수행하고 그 후에 만회 할 필요가없는 경우이 메서드를 사용하십시오.

관련 문제