عنوان الكتاب المنتقى استخدام الذاكرة الغموض في اي فون 3.0 المشروع

StackOverflow https://stackoverflow.com/questions/1205773

سؤال

أنا على الحصول على عناوين البريد الإلكتروني من عنوان كتاب من الكاكاو لمسة المشروع والحصول على بعض النتائج غير متوقعة من حيث استخدام الذاكرة.يفتح المستخدم ABPeoplePicker و إذا كان AB دخول أنها لمسة واحدة عنوان البريد الإلكتروني أو أي عنوان البريد الإلكتروني يستخدم

  • (منطقي) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)شخص

وإذا كان إدخال عناوين البريد الإلكتروني المتعددة ، فإنه ينتقل إلى

  • (منطقي)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)شخص مكان الإقامة:(ABPropertyID)الخاصية معرف:(ABMultiValueIdentifier)معرف {

في واحد عنوان البريد الإلكتروني من الذاكرة المستخدمة من قبل المنتقى صدر بعد عنوان البريد الإلكتروني المحدد.في ثاني البريد الإلكتروني المتعددة الحالة ، عن 300k هو أبقى و لا صدر و هذا يزيد في كل مرة متعدد عنوان البريد الإلكتروني إدخال دفتر المختار.وأعتقد أن لدي يدويا صدر كل ما أحتاج في AB أساليب وأنا لا يمكن أن تعقب ما يمسك الذاكرة أو كيفية إصلاح ذلك و أنا لا أرى أي وظائف أخرى عن هذا كونه علة لذلك أظن أن لدي خطأ.إذا كان أي شخص لديه أي أفكار ما يجري هنا من فضلك اسمحوا لي أن أعرف.وقد أرفقت مثال التعليمة البرمجية أدناه بالنسبة لأولئك الذين يرغبون في إعادة إنشاء المشكلة - فإنه يتصرف مماثل في محاكاة على الجهاز بحيث يمكنك تشغيله في محاكاة مع مراقبة النشاط لرؤية استخدام الذاكرة.شكرا لك على أي مساعدة!

كل من دفتر العناوين.إطار AddressBookUI.إطار تحتاج إلى أن تضاف إلى مشروع تشغيل هذه التعليمة البرمجية من أجل وظيفة ، أنا باستخدام 3.0 SDK:

testViewController.h:

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
@interface testViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
    UITextView *emailList ;
}

@property (nonatomic, retain) UITextView *emailList ;
@end

testViewController.م:

#import "testViewController.h"

@implementation testViewController

@synthesize emailList;

- (void) showContactPicker:(id)sender {

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
[picker release];
}


- (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {
[self dismissModalViewControllerAnimated:YES];
}

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    BOOL returnState = NO;

    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);

    if(ABMultiValueGetCount(emails) <= 0) { // the selected contact has no attached email address

        [self dismissModalViewControllerAnimated:YES];
    }

    else if(ABMultiValueGetCount(emails) == 1) { // the selected contact has exactly one email address

        CFStringRef email = ABMultiValueCopyValueAtIndex(emails, 0);
        NSString *emailString = (NSString *) email;
        self.emailList.text = [self.emailList.text stringByAppendingString:[NSString stringWithFormat:@"%@ ", emailString]];
        [emailString release];
        [self dismissModalViewControllerAnimated:YES];
    }

    else { // the selected contact has many email addresses, continue to the alternate method
        returnState =  YES;
    }

    CFRelease(emails);
    return returnState;
}




- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {  

    ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty);
    CFStringRef multiEmail = ABMultiValueCopyValueAtIndex(multiEmails, identifier);
    CFRelease(multiEmails);
    NSString *multiEmailString = (NSString *) multiEmail;
    //CFRelease(multiEmail); //AnalysisTool pointed out that this is a double release since multiEmailString is an alias of multiEmail
    self.emailList.text = [self.emailList.text stringByAppendingString:[NSString stringWithFormat:@"%@ ", multiEmailString]];
    [multiEmailString release];
    [self dismissModalViewControllerAnimated:YES];
    return NO;
}


- (void)viewDidLoad {
     [super viewDidLoad];

        NSArray *openContactsTitle = [[NSArray alloc] initWithObjects:@"Add Addresses", nil];
        UISegmentedControl *openContacts = [[UISegmentedControl alloc] initWithItems:openContactsTitle];
    openContacts.frame = CGRectMake(10,10,105,30);
    [openContacts addTarget:self action:@selector(showContactPicker:) forControlEvents:UIControlEventValueChanged];
    openContacts.segmentedControlStyle = UISegmentedControlStyleBar;
    openContacts.momentary = TRUE;
    [self.view addSubview:openContacts];
    [openContacts release];
    [openContactsTitle release];

    emailList = [[UITextView alloc] initWithFrame:CGRectMake(10,60,200,200)];
    [self.view addSubview:emailList];
    emailList.text = @"";
}


- (void)dealloc {
    [emailList release];
    [super dealloc];
 }

@end
هل كانت مفيدة؟

المحلول

أثناء وضع اي فون بلدي التطبيق المسلسل البريد كنت قد اكتشفت تسرب ذاكرة في ABPeoplePickerNavigationController.لقد قدم هذا الخلل إلى أبل علة المراسل.ردود الفعل من أبل أن له علة معروفة (بلدي تقرير الشوائب مغلق مكرر من معرف 6547310).

نصائح أخرى

يمكنك محاولة تشغيل AnalysisTool على ذلك لمعرفة ما إذا كان يمكن الكشف عن أي تسرب في المدونة

خيار واحد هو جعل المنتقى وهو للقراءة فقط الملكية الفئة و لا توليف ذلك.بدلا من إنشاء peoplePicker طريقة التأكد من مثيل واحد فقط من المنتقى هو مثيل.إذا كان هذا لا يعمل مع العرض الحالي دورة حياة واحدة خيار مجردة إلى الفعلية الطبقة المفردة.

هنا مثال اعتدت على الصورة المنتقى (الكاميرا) التي لديها نفس مشكلة التسريب:

- (UIImagePickerController*)pickerController
{
    // pickerController is a readonly property
    if( pickerController == nil )
    {
        pickerController = [[UIImagePickerController alloc] init];
        pickerController.allowsImageEditing = NO;
    }
    return pickerController;
}

لهذا أنا وضعت جميع النشرات في dealloc و didReceiveMemoryWarning (مع النيل تحقق لتجنب الإفراج عن النيل).في هذه الحالة سوف يحد عمليا كيف في كثير من الأحيان عنوان كتاب المنتقى هو مثيل.في العديد من الأماكن أبل توصي باستخدام المفرد تنفيذ تستهلك ذاكرة المنتقى واجهات برمجة التطبيقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top