هل هناك طريقة لفرض التحقق من نوع وقت التشغيل في الهدف - C على الكاكاو؟

StackOverflow https://stackoverflow.com/questions/2039511

سؤال

مرحبا، أجد وسيلة لفرض التحقق من نوع وقت التشغيل أو الأشياء في الهدف - C على الكاكاو.

هذا هو عينة الكود الخاصة بي. كنت أتوقع خطأ وقت التشغيل حول مهمة خاطئة للمتغير 'B'. لكن لم يكن كذلك. تم تجميعها وتنفيذها دون أي خطأ.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 NSArray* a = [NSArray arrayWithObject: @"TEST"]; 
 NSURL* b = [a objectAtIndex:0]; 

    NSLog(@"Is this URL? %i", [b isKindOfClass:NSURL.class]);
    [pool drain];
    return 0;
}

// Console log after program execution:
// 2010-01-11 10:25:02.948 Type Checking[98473:a0f] Is this URL? 0

لقد فوجئت أنه لا يوجد فحص نوع وقت التشغيل هناك. لأنني استخدمت جميع اللغات العالية المستوى مثل VB، C #، Java، Actioncript ... لا أعرف لغة منخفضة المستوى مثل C، لذلك لا يمكنني التأكد من أن هذه هي الطريقة الصحيحة ... كان من الصعب حقا معرفة ذلك لماذا لا يوجد خطأ في الترجمة أو وقت التشغيل. لكنني أفهم ذلك كقاعدة طبيعية في العالم الحقيقي. ولكن التحقق من نوع أكثر قوة سوف يساعدني كثيرا. حتى في جلسة تصحيح الأخطاء فقط. هل هناك أي طريقة للقيام بذلك؟

وإذا لم يكن هناك فحص نوع وقت التشغيل، فما نوع من استراتيجية الترميز والتصحيح التي يجب علي استخدامها حول القيم المكتوبة الخطأ؟ وما هي التجانس بين التحقق من نوع التشغيل هو أو ليس كذلك؟

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

المحلول

الهدف - C لديه فحص نوع تجميع حجج الرسائل وأنواع العودة، ولكنه خاسر إلى حد ما من العديد من اللغات الأخرى. الفرق الرئيسي واحد هو أن فئات التجميع مثل nsarray و nsdictiomary عامة. يمكنك وضع أي نوع من الأشياء في NSArray - لا يجب أن تكون العناصر هي نفس النوع. لذلك، لا يوجد فحص من النوع عند إضافة أو الوصول إلى العناصر.

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

نصائح أخرى

حسنا، هناك فحص نوع وقت التشغيل، لكنه يحدث في وقت لاحق قليلا. أفترض أنك تتوقع استثناء نوعا من الاستثناء عند محاولة وضع مثيل NSSTRING في متغير NSURL *. بدلا من ذلك، ستحصل على الاستثناء عند محاولة استدعاء أي أساليب محددة NSURL على مثيل NSSTRING الخاص بك.

على سبيل المثال، إذا حاولت [b isFileURL] ستحصل على استثناء مثل "NSSTRING لا يستجيب لمحدد" isfileurl ".

من المهم أيضا أن نفهم لماذا لا يوجد فحص من نوع الترجمة في المثال الخاص بك. على وجه التحديد، فإن عدم وجود فحص نوع الترجمة من نوعه هو خاصية فريدة ومهمة لل id اكتب، وهو ما nsarray -objectAtIndex: عائدات.

غالبا ما ينطلق إطار NSOBJECT ضجة عندما يكون النوع خطأ ولكن يمكنك التحقق يدويا للنوع ورمي استثناء:

if (![obj isKindOfClass:SomeObjectClass.class])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj xyz];

...

if (![obj conformsToProtocol:@protocol(SomeProtocol)])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj abc];

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

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