كيفية تفريغ البيانات المخزنة في كائن الهدف-ج (NSArray أو NSDictionary)

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

  •  08-07-2019
  •  | 
  •  

سؤال

اعذرني على السؤال الذي قد يكون سخيفًا هنا، ولكن في لغات البرمجة الأخرى (لغات البرمجة النصية مثل PHP أو Perl) غالبًا ما يكون من السهل تفريغ كل شيء موجود داخل المتغير.

على سبيل المثال، في PHP هناك var_dump() أو print_r() المهام.بيرل لديه Data::Dumper فئة CPAN، وما إلى ذلك.

هل هناك شيء مثل هذا لـ Objective-C؟سيكون من المناسب جدًا في بعض الحالات أن تكون قادرًا على تفريغ كل شيء من هذا القبيل، بدلاً من استخدام gdb لفحص كل متغير.

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

المحلول

في Cocoa، لا يوجد "تفريغ" مثل PHP's print_r أو python repr نظرًا لعدم وجود تنسيق نصي "يمثل" كائنًا كما هو الحال في تلك اللغات.إذا كنت تستخدم

NSLog(@"%@", myObj);

أو

NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];

أو

NSString *stringRep = [myObj description];

سوف تحصل (تسجيل الدخول إلى وحدة التحكم في الحالة الأولى)، نتيجة [myObj description], ، الطريقة المحددة في NSObject لغرض الطباعة أ وصف (لا تفريغ) من كائن.

إذا استدعيت po myObj في GDB، تحصل عليه [myObj debugDescription] (في كثير من الأحيان نفس description, ، لكن ليس دائما).

فصول مثل NSArray و NSDictionary و NSData تجاوز description لطباعة وصف متكرر مفيد جدًا لمحتوياتها، ولكن الافتراضي [NSObject description] يطبع فقط قيمة المؤشر المقابلة للمثيل.

إذا كنت تتحكم في التعليمات البرمجية للأنواع المعنية، فيمكنك تجاوزها description أو debugDescription طرق إرجاع أي شيء تريده.إذا لم يكن الأمر كذلك، يمكنك تجاوز description أو debugDescription طريقة باستخدام فئة، أو استخدم فئة لتحديد myDebugDescription أو بعض تلك التي يمكنك استدعاؤها بعد ذلك من gdb باستخدام po [myObj myDebugDescription].

نصائح أخرى

ويمكنك أيضا استخدام الأمر جدب الكائن الطباعة بسرعة عرض كائن في المصحح:

po dictionary

وهذا سيكون أساسا نفس الدعوة NSLog (...) من ضمن التعليمات البرمجية.

ومفيدة أيضا عند الطباعة من NSData يحتوي على بيانات ASCII هي:

p (char *) [data bytes]

استخدم NSLog () لتفريغ محتويات الكائنات. على سبيل المثال:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);

وNSLog لديها سلسلة تنسيق على غرار printf (تتوقع كائن NSString) تلتها قائمة متغير من المعلمات، تماما مثل printf. وحرف استبدال٪ @ يمثل كائن أسلوب الوصف على كائن. وهذا مفيد لإلقاء الأشياء الأكثر الهدف-C في الكاكاو.

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

gdb) po myData

وسوف يسبب جدب لتفريغ الكائن myData. بو هو اختصار للطباعة وجوه.

كن حذرا مع تسجيل NSLog -> كنت على الارجح لا تريد ذلك في رمز الإنتاج

وأنت قد ترغب في استخدام وظيفة تسجيل البديلة التي تدعو NSLog عند تشغيل المنتج الخاص بك في وضع التصحيح.

وأنا غن الذهاب مع هذا "التصحيح" محتويات NSArray:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

والرمز سوف تعداد كافة الكائنات في myarray NSArray، ومن ثم تكرار خلال وطباعة كل كائن.

وهذا الأمل يمكن أن تكون مفيدة لشخص ما!

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