سؤال

أنا مبتدئ في التنمية فون و لقد كنت تناضل مع EXC_BAD_ACCESS خطأ حصلت قبل بضعة أيام.أنا في الأساس أخذ ستانفورد فون فئة بشكل مستقل و أنا أحاول تمرير صفيف من NSManagedObjects إلى TableViewController من المفترض أن عرض لهم.إطلاق التطبيق في محاكاة ويعرض البيانات في tableView ولكن على الفور الأخطاء مع EXC_BAD_ACCESS.

أنا اتبعت التعليمات هنا و في أماكن أخرى على كيفية استخدام NSZombieEnabled لتحديد قبل الأوان صدر الأجسام ولكن هذا واحد يأتي من دون أي فائدة الرسائل حتى مع NSZombieEnabled.أعتقد أنه يجب أن يكون سببه ما تحاول الوصول غير المعينة الذاكرة التي لم يكن صدر خلال إصدار/autorelease.وإلا لكان قد تم انتقاؤها حسب غيبوبة كائن مثل أخطاء أخرى لقد كنت قادرا على إصلاح.أنا لست ج الخبراء ولكن هل هذا يعني أن شيئا مثل هذا يمكن أن يحدث إذا كنت تقوم بتعريف كائن وإرسال رسالة دون أي وقت مضى إنشاء ذلك ؟ نظرت من خلال قانون بلدي لمعرفة ما إذا كان أي شيء مثل ذلك و جئت فارغة.

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

لقد كتبته من stacktrace أدناه (لم أتمكن من معرفة كيفية نسخ من المصحح)

0 objc_msgSend
1 ??
2 -[NSManagedObject dealloc]
3 -[_PFManagedObjectReferenceQueue _processReferenceQue:]
4 _performRunLoopAction
5 ___CFRunLoopDoObservers
6 CFRunLoopRunSpecific
7 CFRunLoopRunInMode
8 GSEventRunModal
9 GSEventRun
10 UIApplicationMain
11 main

و اثنين من أهم الطبقات في البرنامج هي أعلى مستوى المندوبين فئة ViewTableController ويدعو.

`- (باطل)applicationDidFinishLaunching:(UIApplication *)التطبيق {

self.tabBarController = [[[UITabBarController alloc] init] autorelease];        

UINavigationController *contactsNavigationController = [[self createContactsNavigationController] retain];

//UINavigationController *recentsNavigationController = [[self createRecentsNavigationController:photos] retain];

tabBarController.viewControllers = [[NSArray alloc] initWithObjects: contactsNavigationController, nil];

[contactsNavigationController release];
//[recentsNavigationController release];

[window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

}

-(UINavigationController *)createContactsNavigationController {

UINavigationController *contactsNavigationController = [[UINavigationController alloc] init];

UITabBarItem *contactsTabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem: UITabBarSystemItemContacts tag:0];
contactsNavigationController.tabBarItem=contactsTabBarItem ;
[contactsTabBarItem  release];


PersonListViewController *personListViewController = [[PersonListViewController alloc] initWithStyle:UITableViewStylePlain];    

NSManagedObjectContext *context = [self managedObjectContext];
personListViewController.managedObjectContext=context;

personListViewController.contacts = [self createContacts];
[context release];

personListViewController.title=@"Contacts";

[contactsNavigationController pushViewController:personListViewController animated:false];
return [contactsNavigationController autorelease];

}`

`- (NSArray *)readContacts {

NSString *path = [[NSBundle mainBundle] bundlePath];

NSString *filePath = [path stringByAppendingPathComponent:@"FakeData.plist"];
NSArray *plist = [[NSMutableArray arrayWithContentsOfFile:filePath] retain];

return [plist autorelease];
}

- (NSMutableArray *)createContacts {

NSArray * plist = [[self readContacts] retain
NSMutableArray *contactNames = [[NSMutableArray alloc] init];
NSMutableArray *contacts = [[NSMutableArray alloc] init];
for (NSDictionary *photo in plist) {
    NSString *contactName = [photo objectForKey:@"user"];
    Person *contact = nil;
    if (![contactNames containsObject:contactName]) {
        contact  = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
        contact.name =contactName;
        NSError *error;
        if (![managedObjectContext save:&error]) {
            NSLog(@"SHIT the save person FAILED!!!  %@",error);
        }

        [contacts addObject:contact];
        [contactNames addObject:contactName];



    } else {
        contact = [contacts objectAtIndex:[contactNames indexOfObject:contactName]];
    }

    [contactName release];

    Photo *image = (Photo *)[NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:managedObjectContext];

    image.imageFile = [photo objectForKey:@"path"];
    image.imageName = [photo objectForKey:@"name"];
    image.owner = contact;

    contact.photos = [NSSet setWithObjects:image,nil];


     NSError *error;
     if (![managedObjectContext save:&error]) {
         NSLog(@"SHIT the save photoFAILED!!!  %@",error);
     }

    [image release];
    [contact release];
}

[plist release];

return [contacts autorelease];
}

أعتذر إن قانون بلدي جدا كربي القراءة.

شكرا على المساعدة يا شباب.

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

المحلول

وهنا المشكلة:

NSString *contactName = [photo objectForKey:@"user"];
... a bunch of lines later
[contactName release];

وobjectForKey: بإرجاع كائن autoreleased، يجب أن لا الإفراج عنها.

وعلى نحو مماثل، insertNewObjectForEntityForName:inManagedObjectContext:managedObjectContext بإرجاع كائن autoreleased، لذلك إزالة [image release] و[contact release]

نصائح أخرى

كنت أيضا الحصول على EXC_BAD_ACCESS دون أي فائدة الرسالة على الرغم من NSZombieEnabled تم فحصها.لذا أود أن أشارك هذه التجربة:

بعد عدة ساعات من الكفاح مع محاكاة, قررت تثبيته على الجهاز.رسالة الخطأ التي حصلت عليها من التصحيح مع الجهاز كان أكثر فائدة.

في نهاية المطاف, لقد لاحظت أن كنت الحصول على EXC_BAD_ACCESS الخطأ سلوك غريب لأنني سميت بضع xib الملفات قبل يوم واحد.اخترت عرض وحدة تحكم' الكائن MainWindow.xib ملف تصحيح اسم بنك الاستثمار القومي مكان الإقامة.ثم كل شيء يعمل بسلاسة.

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