明らかに異なる理由で、この同じアプリの他の部分で 48 バイトの strdup リークを経験したため、この時点で、これらのリークが CoreData 関連であるかどうかはわかりません - 私の他の質問を参照してください:別のスタックオーバーフローの質問
しかし、関係がないと仮定すると、オプションを選択したユーザーに基づいて ABPeoplePicker を表示する viewController があります。ただし、連絡先を選択するかどうかに関係なく、ピッカーを提示するだけで漏れているようです。
ピッカーを表示するコードは次のとおりです。
- (void)showPeoplePickerController
{
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]];
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
[picker release];
}
そして、デリゲート メソッドは次のように実装されます。
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return YES;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
{
ABMultiValueRef emails = ABRecordCopyValue(person, property);
if(userEmailString)
[userEmailString release];
userEmailString = (NSString*)ABMultiValueCopyValueAtIndex(emails, identifier);
CFRelease(emails);
[[NSNotificationCenter defaultCenter] postNotificationName:@"recipientEmailDidUpdateNotification"
object:self];
return NO;
}
念のため、userEmailString はコントローラーの保持された NSString プロパティです (つまり、self.userEmailString = 何とかすることもできます)。
これらは、Instruments からのスクリーンショットで、リークを報告しています。しかし、私はそれを提示した後に release を呼び出していますが、それはピッカーが解放されていないと考えていることに注意してください。また、代わりに CFRelease() を試してみましたが、それでも同じです。