سؤال

لقد رأيت العديد من المطورين الذين يضيفون العديد من وحدات الماكرو إلى بادئة مشاريع iOS الخاصة بهم.

ماذا (أو لا) تنصح بإضافة إلى ملف iOS prefix.pch؟ كيف تبدو البادئة الخاصة بك؟

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

المحلول

EWWW ... لا تضع وحدات الماكرو في ملف .pch! ملف .pch هو ، بحكم تعريفه ، رأسًا محددًا مسبقًا للمشروع. لا ينبغي استخدامه حقًا إلى ما بعد سياق المشروع ولا ينبغي أن يحتوي على أي شيء سوى #includeرمل #importس.

إذا كان لديك بعض وحدات الماكرو ، بحيث تريد مشاركتها بين الرؤوس ، ثم التمسك في ملف رأس خاص بهم - Common.h أو أيا كان - و #include الذي - التي في بداية .pch.

نصائح أخرى

لنظام التشغيل iOS الحديث و OS X ، يجب أن يستخدم الناس الوحدات النمطية. يتم تمكين هذا افتراضيًا للمشاريع الجديدة ، ويتم تحقيق الاستيراد/التضمين باستخدام @import.

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

باستخدام الوحدات النمطية ، لا تحتاج إلى PCH ، وربما يجب عليك التخلص منها تمامًا - لصالح الاستخدام @import محلي إلى التبعية. في هذه الحالة ، تقوم PCH فقط بحفظك من الكتابة الادراج المحلية إلى التبعيات (التي يجب أن تفعلها على أي حال).

الآن ، إذا نظرنا إلى الوراء إلى السؤال الأصلي: يجب عليك تجنب ملء PCH الخاص بك بكل أنواع الأشياء العشوائية ؛ وحدات الماكرو ، الثوابت ، #defines, ، وجميع أنواع المكتبات الصغيرة. عموما ، يجب عليك احذف ما هو غير ضروري حقًا لأغلبية ملفات المصدر الخاصة بك. وضع كل أنواع الأشياء في PCH الخاص بك هو مجرد إضافة مجموعة من الوزن والاعتماد. أرى الناس يضعون كل ما يرتبطون به وأكثر من ذلك في PCH. في الواقع ، عادة ما تحتاج الأطر الإضافية إلى أن تكون مرئية لبعض الترجمات في معظم الحالات. على سبيل المثال ، "هنا هي StoreKit Stuff - دعنا نستورد storekit فقط أين هو يجب أن تكون واضحة. على وجه التحديد ، هذه الترجمات الثلاثة ". هذا يحافظ على أوقات البناء الخاصة بك لأسفل ، ويساعدك على تتبع تبعياتك ، بحيث يمكنك إعادة استخدام التعليمات البرمجية بسهولة أكبر. لذلك في مشروع OBJC ، عادة ما تتوقف عند الأساس. إذا كان هناك الكثير من واجهة المستخدم ، قد تفكر في إضافة Uikit أو AppKit إلى PCH الخاص بك. كل هذا يفترض أنك ترغب في تحسين أوقات البناء. واحدة من المشكلات مع PCHs الكبيرة التي تشمل (تقريبًا) كل شيء هو أن إزالة التبعيات غير الضرورية تستغرق وقتًا طويلاً. تنمو تبعيات مشروعك وترتفع أوقات البناء الخاصة بك ، تحتاج إلى القتال من خلال القضاء على التبعيات غير الضرورية من أجل تقليل أوقات البناء الخاصة بك. وأيضًا ، يجب أن يتم إبعاد أي تغييرات في كثير من الأحيان عن PCH الخاص بك. يتطلب التغيير إعادة بناء كاملة. هناك بعض الخيارات لمشاركة PCHS. إذا كنت تستخدم PCHS ، فقم بتهدف إلى دعم المشاركة.

بقدر ما وضعت في PCH الخاص بي: توقفت عن استخدامها للغالبية العظمى من الأهداف قبل سنوات. عادة ما يكون هناك عادة ما يكفي للتأهل. ضع في اعتبارك ، أكتب C ++ و OBJC و OBJC ++ و C - ينبعث المترجم واحدًا لكل لانغ في هدفك. لذا فإن تمكينهم في كثير من الأحيان يؤدي إلى أوقات ترجمة أبطأ وأعلى I/O. في النهاية ، فإن زيادة التبعية ليست وسيلة جيدة لمكافحة التبعية في المشاريع المعقدة. العمل مع لغات/لهجات متعددة ، يوجد تباين كبير في التبعيات المطلوبة لهدف معين. لا ، لن أنصح ذلك بشكل مثالي لكل مشروع ، لكن هذا يعطي بعض المنظور لإدارة التبعية في المشاريع الكبيرة.


مراجع


ملاحظات

  • تم طرح هذا السؤال في الأصل قبل بضع سنوات من مقدمة الوحدات النمطية.
  • في الوقت الحاضر (Xcode 5.0) ، تعمل الوحدات النمطية لـ C و OBJC ، ولكن ليس C ++.

وأنا أتفق مع bbum. رأيي في ملف PCH هو أنه يجب أن يحتوي على حد كبير فقط #include أو #import صياغات. لذا ، إذا كان لديك مجموعة من وحدات الماكرو المفيدة عالية المستوى ، فقم بتعريفها في شيء مثل Common.h و #import هذا الملف ، كما اقترح bbum.

عادة ما أذهب خطوة إلى الأمام وأستخدم ملف PCH إلى #import ملف يسمى XXCategories.h (أين XX هي اتفاقية بادئة تسمية الفصل التي تستخدمها) التي تحتوي على #importS لجميع فئات فئة Uikit و Foundation: NSString+XXAdditions.h, UIColor+XXAdditons.h, ، إلخ.

إنشاء ملف رأس "Macros.h"

استيراد هذا الرأس في بادئة.

في هذه الماكرو. وضع جميع الأطر والأشياء المهمة الأخرى.

إذا كنت قلقًا بشأن الأداء ، فلا تقلق ، انظر إلى ما تقوله Apple:

الرؤوس والأداء

إذا كنت قلقًا من أن تضمين ملف رأس رئيسي قد يتسبب في انتفاخ البرنامج ، فلا تقلق. نظرًا لأن واجهات OS X يتم تنفيذها باستخدام الأطر ، فإن رمز تلك الواجهات موجود في مكتبة مشتركة ديناميكية وليس في قابلة للتنفيذ. بالإضافة إلى ذلك ، يتم تحميل الرمز الذي يستخدمه البرنامج فقط في الذاكرة في وقت التشغيل ، وبالتالي فإن بصمة الذاكرة الخاصة بك تبقى صغيرة بالمثل. بالنسبة لتضمين عدد كبير من ملفات الرأس أثناء التجميع ، مرة أخرى ، لا تقلق. يوفر Xcode منشأة رأس مسبقة للتسريع لتسريع أوقات التجميع. من خلال تجميع جميع الرؤوس الإطارية في وقت واحد ، ليست هناك حاجة لإعادة ترجمة الرؤوس إلا إذا قمت بإضافة إطار عمل جديد. في غضون ذلك ، يمكنك استخدام أي واجهة من الأطر المضمّنة مع عقوبة أداء ضئيلة أو معدومة.

أيضا في وحشي. لقد وضعت الكثير من الثوابت مثل:

// delegate
#define UIAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]
#define APPDELEGATE   ((AppDelegate *)[[UIApplication sharedApplication] delegate])

// system
#define IS_IPHONE_4INCH (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height==568)
#define IS_IPAD                     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

// screen size
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
#define IS_RETINA_DISPLAY ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
#define IS_PORTRAIT                 UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])
#define IS_LANDSCAPE                UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])

//system version
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

// math
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

// cores
#define RGB(r,g,b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
#define MAKECOLOR(R, G, B, A) [UIColor colorWithRed:((float)R/255.0f) green:((float)G/255.0f) blue:((float)B/255.0f) alpha:A]
#define MAKECOLORFROMHEX(hexValue) [UIColor colorWithRed: ((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]



//customizations
#define SHOW_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
#define HIDE_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

#define SHOW_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:FALSE];
#define HIDE_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:TRUE];

#define VC_OBJ(x) [[x alloc] init]
#define VC_OBJ_WITH_NIB(x) [[x alloc] initWithNibName : (NSString *)CFSTR(#x) bundle : nil]

#define RESIGN_KEYBOARD [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

#define CLEAR_NOTIFICATION_BADGE                       [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
#define REGISTER_APPLICATION_FOR_NOTIFICATION_SERVICE  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]

#define HIDE_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
#define SHOW_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top