سؤال

تواجه مشاكل مع خارج نطاق NSDate في تطبيق iPhone.

لدي واجهة محددة مثل هذا:

@interface MyObject : NSoObject {
    NSMutableArray  *array;
    BOOL        checkThis;
    NSDate      *nextDue;

}

الآن في التنفيذ لدي هذا:

-(id) init
{
    if( (self=[super init]) ) {
        checkThis = NO;
        array = [[NSMutableArray alloc] init];
        nextDue = [[NSDate date] retain];


                NSDate *testDate = [NSDate date];
    }
    return self;
}

الآن، إذا قمت بتتبع خلال INIT، قبل أن أقوم فعلا بتعيين المتغيرات CheckThis كما Boolean. تظهر مجموعة Arase كمؤشر 0x0 لأنه لم يتم تعيين بن. لكن المقبل يظهر "خارج نطاق". لا أفهم لماذا هذا خارج نطاق ولكن المتغيرات الأخرى ليست كذلك.

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

تتمثل نقطة أخرى مثيرة للاهتمام إذا قمت بنقل الماوس فوق متغير TestDate أثناء تصحيح الأخطاء، فهذا يظهر كوعي "NSDATE *" الذي أتوقعه لأن هذا هو تعريفه. ومع ذلك، فإن التالي، الذي يتم تعريفه بالنسبة لي بنفس الطريقة تظهر ك "_nscfdate *".

قال أي googling فعلت في هذا الموضوع إن الاحتفاظ هو المشكلة، ولكن في الواقع خارج نطاق قبل أن أحاول تقديم المتغير.

ومع ذلك، في فئة أخرى، نفس التعريف لعمل NSDate موافق. يوضح أنه لا شيء قبل تعيين قيمة إليه. arghhh.

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

المحلول

نشرت أيضا هذا السؤال في منتدى iPhone Dev. الجواب الذي حصلت عليه يبدو أنه صحيح. أساسا، انها مجرد شيء مضحك في المصحح. في الواقع، ليس مضحكا جدا بالنظر إلى مقدار الوقت الذي قضيته فيه. عندما أستخدم NSLOG لعرض نتيجة المتغير، فإنه يقوم بالفعل بإظهار القيمة بشكل صحيح.

مشكلة NSDate مقابل _nscfdate هي كما قال ستيفن، جسر خالية من الخلف.

نصائح أخرى

لست متأكدا من السبب في أن GDB يخبرك أن التاريخ خارج نطاق، ولكن حاول إزالة الاحتفاظ. [تاريخ NSDate] لا يتطلب الاحتفاظ.

لقد رأيت سلوكا وزواجا مثل هذا عندما أخرج وأنست أنني ما زلت أروي وضعي ثنائي في وضع الإفراج.

يجب عليك أيضا التحقق من تعطيل تحميل رمز كسول في Xcode.

لديك بعض الأسئلة هنا.

أولا، W.Hy هي بعض المؤشرات إلى 0x0 والآخرين إلى من قبل init أكملت؟ حسنا، لم يتم الاهتمام بها! لا يمكن الاعتماد على قيمهم حتى تتم إبعادها. حقيقة أن بعضهم nil (0x0) ليس شيئا يجب أن تعتمد عليه.

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

ثالث: NSDate مقابل _NSCFDate. وبعد في الأساس NSDate لديه جسر "مجاني" مع CFDate (المستوى الأدنى، C-Like API لنفس الشيء). يبدو أن المحول البرمجي يختار إظهار إصدار CoreFoundation بدلا من المرء المحدد في التعليمات البرمجية الخاصة بك. لا مشكلة؛ أنا لا تقلق بشأن ذلك.

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