سؤال

أواجه مشكلة تتمثل في أنني أحصل على EX_BAD_ACCESS عند استدعاء الإصدار على كائن NSStream في صفقة التخصيص الخاصة بي على iPhone.

الكود التالي

- (void)dealloc {
    DLog(@"dealloc started for: %@",self);
    @synchronized(self) {
        lookupCount--;
    if (lookupCount==0) {
        UIApplication* app = [UIApplication sharedApplication];
        app.networkActivityIndicatorVisible = NO;
        }
    }
    DLog(@"inStream retain count before release: %d",[inStream retainCount]);
    [inStream release];
    DLog(@"outStream retain count before release: %d",[outStream retainCount]);
    [outStream release];
    [queryToSend release];
    [resultString release];
    [data release];
    [super dealloc];
    NSLog(@"dealloc finsihed for : %@",self);
    }

تعطل مع ex_bad_access على [الإصدار OutStream] ؛خط.

إخراج السجل على النحو التالي

2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 160] dealloc started for: <SimpleQuery: 0x56e540>
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 168] inStream retain count before release: 1
2009-04-29 13:16:28.548 App[30580:20b] -[SimpleQuery dealloc] [Line 170] outStream retain count before release: 1

أتساءل إذا كان أي شخص لديه أي أفكار لماذا قد يكون هذا؟

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

المحلول

في تعليق قلت هذا عنه outstream

تم إنشاؤه بواسطة مكالمة إلى GetStreamStoHostNamed: المنفذ: inputStream: OutputStream:التي لا ينبغي أن تُرجع الأشياء التي صدرت تلقائيًا لا أعتقد.

إنه في الواقع يتم إصداره تلقائيًا.ما لم تكن تحتفظ بهذا الكائن في مكان ما في التعليمات البرمجية الخاصة بك، فأنت لست مسؤولاً عن إدارة الذاكرة الخاصة به.

يجب عليك إلقاء نظرة على إرشادات إدارة ذاكرة Apple.

توفر العديد من الفصول طرقًا للنموذج +اسم classname ...يمكنك استخدامه للحصول على مثيل جديد للفئة.غالبًا ما يشار إليها باسم "مُنشئو الراحة" ، تنشئ هذه الأساليب مثيلًا جديدًا للفئة ، وتهيئته ، وإعادته لك لاستخدامه.على الرغم من أنك قد تعتقد أنك مسؤول عن إطلاق الكائنات التي تم إنشاؤها بهذه الطريقة ، فهذا ليس هو الحال وفقًا لسياسة مجموعة الكاكاو - لا يحتوي اسم الطريقة "تخصيص" أو "نسخة" ، أو يبدأ بـ "New".نظرًا لأن الفصل يخلق الكائن الجديد ، فهو مسؤول عن التخلص من الكائن الجديد.

نصائح أخرى

بعض المشاكل المحتملة:

  • أنت تقفل نفسك للقيام بحلقة إنقاص lookupCount، والتي أفترض أنها تعني أنك تتوقع تشغيل هذا الرمز من سلاسل رسائل مختلفة.يجب أن يكون ذلك علامة حمراء هناك، لأنه إذا كنت تقوم بإلغاء تخصيص مثيل من خيطين في وقت واحد، فإن أحد هذه الخيوط سينتهي به الأمر بمحاولة إلغاء تخصيص مثيل تم إلغاء تخصيصه بالفعل.
  • الاخير NSLog سيحاول الاتصال الطباعة self والتي قد تم بالفعل إلغاء تخصيصها.

لا أعلم أن أيًا من هذه الأمور يتعلق على وجه التحديد [outStream release], ، ولكن يمكن أن تكون ذات صلة.قد ترغب في محاولة تصحيح هذا مع NSZombieEnabled للحصول على مزيد من المعلومات.

تأكد أيضًا من إطلاق سراحك inStream لا يتم إطلاقه ضمنيًا أيضًا outStream, ، إلخ.

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