سؤال

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

على جهاز (iPad ، 4.2 و iPhone المختلفة) ، يتم تعطله في كل مرة مع EXC_BAD_ACCESS. يبدو أن MyString ينفد من النطاق ، ولكن يبدو أن هذا يتعارض مع المثال على ويكيبيديا حيث يتم استخدام نفس المبدأ.

رمز على النحو التالي:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
 });

});

هل يعرف أي شخص لماذا هذا يعطل ، وأفضل طريقة لإصلاحه؟


لقد ارتكبت خطأ تبسيط الكود الخاص بي للحفاظ على سؤالي واضحًا.

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

كان الحل هو استدعاء الطريقة في قائمة انتظار Async الخاصة بي ، وداخل الطريقة لف الرمز في Dispatch_async (dispatch_get_main_queue () ، ^{}) ؛ الكتلة.

اتمنى ان يساعد هذا شخصا اخر.

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

المحلول

لقد ارتكبت خطأ تبسيط الكود الخاص بي للحفاظ على سؤالي واضحًا.

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

كان الحل هو استدعاء الطريقة في قائمة انتظار Async الخاصة بي ، وداخل الطريقة لف الرمز في Dispatch_async (dispatch_get_main_queue () ، ^{}) ؛ الكتلة.

اتمنى ان يساعد هذا شخصا اخر.

نصائح أخرى

سيكون تخميني أن NSString هو كائن Autorelease ، لذا سيتم الخروج من النطاق وإصداره قبل استخدامه في كتلة رمز الانتظار الرئيسية. حاول إضافة الاحتفاظ/الإصدار إلى NSString:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 [myString retain];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
  [myString release];
 });

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