سؤال

وأنا أكتب حاليا تطبيق اي فون باستخدام البيانات الأساسية وأحصل على خطأ EXC_BAD_ACCESS خلال [managedObjectContext توفر: && خطأ] سطر التعليمات البرمجية. هذا الحادث لا يحدث إلا بعد أن تعديل بعض المجالات. وبشكل أكثر تحديدا كيان بلدي اثنين من حقول السلسلة (من أصل حوالي 10 حقول)، التي تحصل على قيمها من عودة وحدة تحكم عرض مشروط (مثل محرر النص). الحادث أيضا لا يحدث إلا بعد أن يتم تحرير هذه المجالات، وهي المرة الأولى التي وضع قيمة في أنه يعمل بشكل جيد.

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

وهنا قسم التعليمات البرمجية التي يتم تحطمها:

[قام]

        - (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex:    (NSInteger)buttonIndex
      switch(buttonIndex) {
              case 0: {
                if(message == nil) {
                  message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
                }
                message.toString = txtTo.text;
                message.fromString = txtFrom.text;
                message.subjectString = txtSubject.text;
                message.backgroundColor = [NSNumber numberWithInt:[bgColor intValue]];
                message.textArray = [NSString stringWithFormat:@"%@", stringTextArray];
                message.htmlString = [NSString stringWithFormat:@"%@", stringHTML];
                message.timeStamp = [NSDate date];
                message.statusCode = [NSNumber numberWithInt:0];
                NSError *error = nil;
                if (![message.managedObjectContext save:&error]) {
                    abort();
                }   
                break;
               }
              case 1: {
             break;
              }
      }
      if(buttonIndex != modalView.cancelButtonIndex) {
      [webViewBody loadHTMLString:@"<html><head></head><body></body></html>" baseURL:[NSURL URLWithString:@""]];
      [self.navigationController popToRootViewControllerAnimated:YES];
}

و}

وهنا في سجل الأعطال:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000015
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x30011940 objc_msgSend + 20
1   CoreData                        0x367f7d3e -[NSKnownKeysDictionary1 dealloc] + 82
2   CoreData                        0x367f7cda -[NSKnownKeysDictionary1 release] + 34
3   CoreData                        0x3687eec4 -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] + 40
4   CoreData                        0x36821030 -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] + 16
5   CoreData                        0x368205f2 -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] + 958
6   CoreData                        0x368133bc -[NSManagedObjectContext save:] + 412
7   Decome                          0x0001fdd6 -[CreateMessageViewController actionSheet:clickedButtonAtIndex:] (CreateMessageViewController.m:163)
8   UIKit                           0x30a6cbd8 -[UIActionSheet(Private) _buttonClicked:] + 256
9   CoreFoundation                  0x30256dd4 -[NSObject performSelector:withObject:withObject:] + 20
10  UIKit                           0x3096e0d0 -[UIApplication sendAction:to:from:forEvent:] + 128
11  UIKit                           0x3096e038 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
12  UIKit                           0x3096e000 -[UIControl sendAction:to:forEvent:] + 44
13  UIKit                           0x3096dc58 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 528
14  UIKit                           0x309a6e9c -[UIControl touchesEnded:withEvent:] + 452
15  UIKit                           0x309a60d4 -[UIWindow _sendTouchesForEvent:] + 520
16  UIKit                           0x309a5464 -[UIWindow sendEvent:] + 108
17  UIKit                           0x30936e3c -[UIApplication sendEvent:] + 400

ويقدر أي مساعدة، شكرا.

وUPDATE: أيضا، على الرغم من أن تعطل البرنامج، وعندما فتح إعادته فقد حفظ البيانات بشكل صحيح. لذلك يجب أن يحدث في EXC_BAD_ACCESS بعد أن حصلت على حفظ ما لا يقل بعيدا بما فيه الكفاية لتخزين في مخزن المستمر على ما أعتقد.

إذا كنت التعليق خارج خط حفظ، رمز يعمل بشكل جيد الآن. ولكنه لا يحفظ بعد أن أغلق والخروج. إذا قمت بتشغيل خط حفظ في بلدي الجذر مشاهدة تحكم willAppear وظيفة، فإنه يلقي نفس الخطأ EXC_BAD_ACCESS. وحدة لا يقول أي شيء آخر غير EXC_BAD_ACCESS إذا أفعل المتتبع الخلفي أحصل على:

#0  0x30011940 in objc_msgSend ()
#1  0x367f7d44 in -[NSKnownKeysDictionary1 dealloc] ()
#2  0x367f7ce0 in -[NSKnownKeysDictionary1 release] ()
#3  0x3687eeca in -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] ()
#4  0x36821036 in -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] ()
#5  0x368205f8 in -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] ()
#6  0x368133c2 in -[NSManagedObjectContext save:] ()
#7  0x0000314e in -[RootViewController viewWillAppear:] (self=0x11b560, _cmd=0x3014ecac, animated=1 '\001') at /Users/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:85

وعذرا لم يكن مهيأ رمز بشكل صحيح من قبل. عندما يحصل إنشاء وحدة تحكم عرض إذا لم يكن "رسالة" الجديدة يتم تمرير كائن رسالة تم الحصول عليها من fetchedResultsController مثل ذلك:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MailMessage *aMessage = (MailMessage *)[fetchedResultsController objectAtIndexPath:indexPath];
    [messageView loadMessage:aMessage viewOnly:NO usingTemplate:NO];
    messageView.managedObjectContext = self.managedObjectContext;
    [self.navigationController pushViewController:messageView animated:YES]; 
}

و(المجموعة الاولى من التعليمات البرمجية من ملف MessageViewController.m الذي هو الفئة التي messsageView هو)

ووتحطم إلا إذا أقدم بلدي EditorViewController كطريقة عرض الوسائط ومن ثم العودة. حتى إذا قمت بتغيير خطوط textArray وhtmlString (والتي هي الشيء الوحيد الذي يؤثر على عرض مشروط) إلى:

message.textArray = @"HELLO";
message.htmlString = @"HELLO";

وأنها لا تزال تعطل. إذا أعلق كلا الخطين خارج ومع ذلك فإنه لا تعطل.

وهكذا يبدو أنها تعطل إذا أقدم وجهة نظر الوسائط ومن ثم محاولة تحرير إما textArray أو حقول htmlString من بلدي NSOManagedObject ...

وهنا هو المكان الذي عرض وجهة النظر:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event {
    if(!viewOnly) {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView: txtTo];
    location = [touch locationInView: webViewBody];
        if(CGRectContainsPoint(webViewBody.bounds, location)) {
            [editor loadTextArrayString:stringTextArray];
            [self presentModalViewController:editor animated:YES];
        }
    }
}

وأين يمكنني صرف النظر عنها:

-(void)returnWithTextArray:(NSString *)arrayString HTML:(NSString *)html bgColor:(NSNumber *)numColor {
    [self dismissModalViewControllerAnimated:YES];
    self.stringTextArray = [NSString stringWithFormat:@"%@", arrayString];
    self.stringHTML = [NSString stringWithFormat:@"%@", html];
    self.bgColor = [NSNumber numberWithInt:[numColor intValue]];
    [webViewBody loadHTMLString:self.stringHTML baseURL:[NSURL URLWithString:@""]];
}
هل كانت مفيدة؟

المحلول 2

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

[managedObjectContext setRetainsRegisteredObjects:YES];

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

نصائح أخرى

وويضمن لك فقط للاحتفاظ الوصول إلى كائن مدار من سياق ما دام التغيير معلقة إلى هذا الكائن (إدراج أو تحديث، حذف). بمجرد إجراء مكالمة لإنقاذ :، يمكنك أن تفقد رجوع إلى كائن المدارة.

وبينما كنت توقفت عن الحصول على الخطأ عند تعيين setRetainsRegisteredObjects: نعم، قد أدخلت قضية إدارة الذاكرة، وكنت في وضع عمر الكائن تمكن من أن تعتمد على عمر سياق الكائن المدارة. إذا كنت تمر السياق الخاص بك حول أنحاء التطبيق، وهذا يمكن أن يحصل كبيرة نوعا ما إذا كان لديك التسلسل الهرمي كائن كبير.

ويمكنك قراءة المزيد في مستندات أبل هنا: <لأ href = "http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html" يختلط = " noreferrer "> http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html .

وفقط لمساعدة الآخرين لها نفس القضية، ويعزز استجابة Steff من فوق، والسبب المرجح لهذا الخطأ هو أن تحاول الافراج عن NSManagedObject.

ولقد رأيت العديد من السلوكيات مضحكة مع البيانات الأساسية على اي فون التي تم حلها عن طريق إعادة المحتويات والإعدادات في محاكاة فون.

وأنا أعلم أن هذا هو عدو السحالي ولكن كان لي نفس المشكلة اعتقد ذلك أود أن أضم tuppence عن كيفية I حل القضية، وكان السبب الألغام عن طريق الإفراج عن كائن مدار يدويا داخل عرض مشروط، أزلت المكالمات الإفراج وكل شيء يسير على ما يرام :) وفقا لمستندات يجب أن لا يدويا محاولة لاطلاق سراح الكائنات المدارة على أي حال كما سياق سوف ننظر بعد كل ذلك. هذا هو تجربتي على أي حال، والبحث من خلال التعليمات البرمجية للقيم الإفراط في إطلاق سراحهم.

ويجب تعيين ذاكرة التخزين المؤقت FRC إلى شيء

ولقد حلت مشكلة مماثلة عن طريق التأكد من أن الكائن هو المنال، وذلك لالمثال أعلاه:

if ( message == nil ) {
    message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
} else {
    NSError *error = nil;
    message = (MailMessage *)[managedObjectContext existingObjectWithID:[message objectID] error:&error];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top