iOS Prefix.pch সেরা অনুশীলন


90

আমি অনেক বিকাশকারীকে দেখেছি যা তাদের আইওএস প্রকল্পের প্রিফিক্স.পুচে বিভিন্ন সুবিধা ম্যাক্রো যুক্ত করে add

আইওএস প্রেফিক্স.পিচএইচ ফাইলটিতে আপনি কী যুক্ত করবেন (বা করবেন না)? আপনার Prefix.pch দেখতে কেমন?


বিষয়টির উপর একটি বিস্তারিত ব্লগ পোস্ট: cimgf.com/2010/05/02/my-current-prefix-pch-file
এইচপিক

4
কেবলমাত্র আপনার ম্যাক্রোগুলিকে একটি শিরোনাম ফাইলটিতে রাখুন, উদাহরণস্বরূপ Macros.h, এবং তারপরে এই ফাইলটি আপনার মধ্যে আমদানি করুন prefix.pch
মলোক

আমিও একই সমস্যার মুখোমুখি ...
এক্সকোড

উত্তর:


121

ইভিউ ... একটি .pch ফাইলে ম্যাক্রোগুলি রাখবেন না! একটি .pch ফাইলটি সংজ্ঞা অনুসারে একটি প্রকল্প নির্দিষ্ট প্রাকম্পম্পাইল শিরোনাম। এটি সত্যিই প্রকল্পের প্রেক্ষাপটের বাইরে ব্যবহার করা উচিত নয় এবং এটিতে #includeএস এবং #importএস ব্যতীত অন্য কিছু থাকা উচিত নয় ।

যদি আপনার কাছে কিছু ম্যাক্রো থাকে এবং এমন যে আপনি শিরোনামগুলির মধ্যে ভাগ করতে চান, তবে তাদের নিজের একটি হেডার ফাইল - Common.hবা যাই হোক না কেন - এবং #include যেটি .pch এর শুরুতে আটকে দিন stick


আপনি কি এই সাধারণ। অন্তর্ভুক্ত করবেন?
এইচপিমিক

4
কিছুই না; আমি এটিতে বিভিন্ন # ডেফাইনস ইত্যাদি রেখেছি।
বুবুম

37

আধুনিক আইওএস এবং ওএস এক্সের জন্য, লোকদের মডিউলগুলি ব্যবহার করা উচিত । এটি নতুন প্রকল্পগুলির জন্য ডিফল্টরূপে সক্ষম হয় এবং আমদানি / অন্তর্ভুক্তি ব্যবহার করে সম্পন্ন হয় @import

মডিউলগুলি সংকলকটিকে মডিউলের সামগ্রীর (যেমন একটি ফ্রেমওয়ার্কের শিরোনাম) মধ্যবর্তী উপস্থাপনা তৈরি করার অনুমতি দেয়। অনেকটা পিএইচসি-র মতো, এই মধ্যবর্তী উপস্থাপনাটি একাধিক অনুবাদে ভাগ করা যেতে পারে। তবে মডিউলগুলি এটি আরও একধাপ এগিয়ে নেয় কারণ মডিউল অগত্যা নির্দিষ্ট নির্দিষ্ট নয় এবং তাদের ঘোষণাগুলি স্থানীয়করণের প্রয়োজন হয় না (ক *.pch)। এই উপস্থাপনাটি আপনাকে একটি টন রিলান্ড্যান্ট কম্পাইলারের কাজ বাঁচাতে পারে।

মডিউলগুলি ব্যবহার করে, আপনার কোনও পিএইচসি প্রয়োজন হবে না এবং আপনার সম্ভবত তাদের সম্পূর্ণভাবে শেষ করে দেওয়া উচিত - @importস্থানীয়তা নির্ভরতার জন্য ব্যবহার করার পক্ষে । সেক্ষেত্রে, একটি পিসিএইচ আপনাকে কেবল স্থানীয়ভাবে নির্ভরতাগুলিতে অন্তর্ভুক্তিগুলি টাইপ করা থেকে বাঁচাচ্ছে (কোন আইএমও আপনার হওয়া উচিত)।

এখন, আমরা যদি আসল প্রশ্নটির দিকে ফিরে তাকাই: আপনার সমস্ত প্রকারের এলোমেলো জিনিস দিয়ে আপনার পিএইচসি পূরণ করা উচিত নয়; ম্যাক্রোস, ধ্রুবক #definesএবং সমস্ত ছোট ছোট লাইব্রেরি। সাধারণত, আপনার উত্স ফাইলগুলির বেশিরভাগের কাছে যা অপ্রয়োজনীয় তা বাদ দেওয়া উচিত । আপনার PCH- এ সমস্ত ধরণের স্টাফ রেখে কেবল ওজন এবং নির্ভরতার একগুচ্ছ যোগ করা হচ্ছে। আমি দেখতে পাচ্ছি যে লোকেরা তাদের লিঙ্ক করা সমস্ত কিছুই পিএইচসি-তে রাখে। বাস্তবে, সহায়ক ফ্রেমওয়ার্কগুলি সাধারণত বেশিরভাগ ক্ষেত্রে কয়েকটি অনুবাদে দৃশ্যমান হওয়া প্রয়োজন। যেমন "এখানে আমাদের StoreKit উপাদান - শুধুমাত্র আসুন আমদানি StoreKit যেখানে এটি অবশ্যইদৃশ্যমান হতে। বিশেষত, এই 3 টি অনুবাদ "। এটি আপনার নির্মাণের সময়কে কমিয়ে দেয় এবং আপনাকে আপনার নির্ভরতার উপর নজর রাখতে সহায়তা করে যাতে আপনি কোডটি আরও সহজেই পুনরায় ব্যবহার করতে পারেন an সুতরাং কোনও ওজেসি প্রকল্পে আপনি সাধারণত ফাউন্ডেশনে থামবেন If যদি অনেক কিছু থাকে ইউআই এর পরে আপনি আপনার পি সি সি-তে ইউআইকিট বা অ্যাপকিট যুক্ত করার বিষয়টি বিবেচনা করতে পারেন This এটি সমস্তই ধরে নেওয়া হচ্ছে আপনি বিল্ড টাইমগুলি অনুকূল করতে চান large বড় পিসিচিতে একটি সমস্যা রয়েছে যার মধ্যে প্রায় (প্রায়) সমস্ত কিছুই অন্তর্ভুক্ত যা অপ্রয়োজনীয় নির্ভরতা অপসারণ করা খুব সময়সাপেক্ষ। আপনার প্রকল্পের নির্ভরতা বৃদ্ধি পায় এবং আপনার বিল্ডিংয়ের সময় বাড়তে থাকে, আপনার বিল্ডিং সময়কে হ্রাস করার জন্য আপনাকে অপ্রয়োজনীয় নির্ভরতা দূরীকরণের সাথে লড়াই করতে হবে এবং এছাড়াও, সাধারণত যে পরিবর্তনগুলি সাধারণত ঘটে থাকে তা আপনার PCH এর বাইরে রাখা উচিত A পরিবর্তনের পুরো পুনর্নির্মাণের প্রয়োজন। PCHs ভাগ করার জন্য কিছু বিকল্প রয়েছে you আপনি যদি পিসিএইচ ব্যবহার করেন,

আমি আমার পিএইচসি-তে যতটুকু রেখেছি: আমি বহু বছর আগে লক্ষ্যমাত্রার বিশাল সংখ্যাগরিষ্ঠের জন্য সেগুলি ব্যবহার বন্ধ করে দিয়েছি। যোগ্যতা অর্জনের জন্য কেবল সেখানে পর্যাপ্ত পরিমাণে নেই। মনে রাখবেন, আমি সি ++, ওবিজেসি, ওবিজেসি ++ এবং সি লিখি - সংকলকটি আপনার টার্গেটে প্রতিটি ল্যাংয়ের জন্য একটির নিঃসরণ করে। সুতরাং এগুলি সক্ষম করার ফলে প্রায়শই ধীর সংকলনের সময় এবং উচ্চতর আই / ও হয়। শেষ পর্যন্ত, জটিল প্রকল্পগুলিতে নির্ভরতার বিরুদ্ধে লড়াই করার জন্য নির্ভরতা বাড়ানো ভাল উপায় নয়। একাধিক ভাষা / উপভাষার সাথে কাজ করা, একটি নির্দিষ্ট লক্ষ্যের জন্য প্রয়োজনীয় নির্ভরতাগুলির মধ্যে অনেক পার্থক্য রয়েছে। না, আমি এটি প্রতিটি প্রকল্পের জন্য অনুকূল হিসাবে পরামর্শ দেব না, তবে এটি বৃহত্তর প্রকল্পগুলিতে নির্ভরতা পরিচালনার ক্ষেত্রে কিছুটা দৃষ্টিভঙ্গি দেয়।


তথ্যসূত্র


মন্তব্য

  • এই প্রশ্নটি মূলত মডিউলগুলির পরিচয়ের কয়েক বছর আগে জিজ্ঞাসা করা হয়েছিল।
  • বর্তমানে (এক্সকোড 5.0), মডিউলগুলি সি এবং ওবজির জন্য কাজ করে তবে সি ++ নয়।

মডিউল সক্ষম প্রকল্পের জন্য সম্পূর্ণ পুনর্নির্মাণের অর্থ কী does আপনি কি জানেন যে এই নতুন-সুইফট। ব্রিজিং শিরোনামটি অবশ্যই .pch এর জন্য সঠিক প্রার্থী নয়। তবে আমি মানুষকে তা করতে দেখেছি। সুতরাং আপনি দেখতে পাচ্ছেন যে কেউ এটি করে কিনা। .Pch এ আমাদের সর্বদা পরিবর্তনশীল শিরোনাম রয়েছে। সুতরাং এটি প্রতিবার .pch ফাইলে সবকিছু পুনর্নির্মাণ করে -Swift.h পুনরায় জেনারেট করে। তুমি কি এটির সাথে একমত? আপনার আরও ইনপুট আছে?
ম্যাডনিক

@ ম্যাডনিক ধরুন আপনার অ্যাপের পিএইচসি-তে একটি লাইব্রেরি / কাঠামোর একটি মাস্টার শিরোনাম রয়েছে যা আপনি সক্রিয়ভাবে বিকাশ করছেন। উদাহরণস্বরূপ: #import "MyLib/MyLib.h"। যে কোনও সময় কোনও ফাইল MyLib.hপরিবর্তনের মাধ্যমে অন্তর্ভুক্ত করা হয় , অ্যাপ্লিকেশানের প্রতিটি উত্স ফাইলটি পুনরায় সংযুক্ত করতে হবে। আপনি যদি মাত্র একটি উত্স ফাইলে মাইলিব ব্যবহার করেন, তবে মাইলিব পরিবর্তিত হলে কেবল সেই ফাইলটি পুনরায় সংযুক্ত করতে হবে। বিশ্বাস করুন বা না করুন, আমি আজকাল কোনও PCH ফাইল ব্যবহার করছি না।
জাস্টিন

8

আমি বামবামের সাথে একমত আমার পিএইচসি ফাইলটি গ্রহণ করা হ'ল এটিতে কেবলমাত্র বিবৃতি #includeবা #importবিবৃতি থাকতে হবে । সুতরাং যদি আপনার কাছে সহায়ক, উচ্চ-স্তরের ম্যাক্রোগুলি রয়েছে, তবে বুবামের পরামর্শ অনুসারে এগুলি Common.hএবং #importসেই ফাইলটিতে কোনও কিছু সংজ্ঞায়িত করুন ।

আমি সাধারণত একটি পদক্ষেপ আরো যেতে এবং PCH ফাইল ব্যবহার #importনামক একটি ফাইল XXCategories.h(যেখানে XXযে আপনার ব্যবহার বর্গ নামকরণ উপসর্গ সম্মেলন হয়) #importআমার UIKit এবং ফাউন্ডেশন বর্গ শ্রেণীর জন্য S: NSString+XXAdditions.h, UIColor+XXAdditons.h, ইত্যাদি


আমি উৎসুক. .PCH ফাইলে, একটি সাধারণ। আমদানি করার মধ্যে কী পার্থক্য রয়েছে যা বিভিন্ন রয়েছে #importএবং কেবল সেগুলি #importসরাসরি আমদানি করতে পারে ? এগুলি কি একই হবে না?, বা এটি কোনও কার্যকারিতা প্রভাবিত করে?
হ্লুং

আমার জ্ঞান, কোন ব্যাপার বাস্তব পার্থক্য। আমার ধারণা, এটি আরও সেরা অনুশীলন। আপনার পিএইচসি ফাইলটিতে একগুচ্ছ ম্যাক্রো এবং অন্যান্য জিনিস মুভ করার পরিবর্তে এটি কেবল #importএবং এর জন্য হওয়া উচিত #include
সিআইফিল্টার

4
পার্থক্যটি পুনরায় ব্যবহারযোগ্য। পিসিএইচ প্রকল্প নির্দিষ্ট। সাধারণ প্রকল্প অনেক প্রকল্পের জন্য সাধারণ হবে। আপনি পুনরায় ব্যবহার করতে পারেন এমন একটি উপ প্রকল্প তৈরির পরিবর্তে আপনি কেবল আপনার সমস্ত ব্যবহারের ক্লাস কেন আপনার প্রকল্পে রাখছেন না তা জিজ্ঞাসা করার মতো। একটি স্বীকৃত উদাহরণ সত্ত্বেও, কারণ এটি কেবল একটি সাধারণ অনুলিপি পেস্ট ... তবে কপির পেস্টটি দুষ্টু।
বান্দেজপাটাইস

6

একটি শিরোনাম ফাইল "macros.h" তৈরি করুন

Prefix.pch এ এই শিরোনামটি আমদানি করুন

এই ম্যাক্রোস.-তে সমস্ত ফ্রেমওয়ার্ক এবং অন্যান্য গুরুত্বপূর্ণ জিনিস রাখুন।

আপনি যদি পারফরম্যান্স নিয়ে চিন্তিত হন তবে চিন্তা করবেন না, দেখুন অ্যাপল কী বলে:

শিরোনাম এবং পারফরম্যান্স

যদি আপনি উদ্বিগ্ন হন যে কোনও মাস্টার শিরোলেখ ফাইল অন্তর্ভুক্ত করার ফলে আপনার প্রোগ্রামটি ফুলে উঠতে পারে তবে চিন্তা করবেন না worry ওএস এক্স ইন্টারফেসগুলি ফ্রেমওয়ার্ক ব্যবহার করে প্রয়োগ করা হয়েছে, সুতরাং সেই ইন্টারফেসগুলির কোডটি একটি কার্যকর গতিযুক্ত লাইব্রেরিতে থাকে এবং আপনার সম্পাদনযোগ্য নয়। তদুপরি, কেবলমাত্র আপনার প্রোগ্রাম দ্বারা ব্যবহৃত কোডটি রানটাইমের সময় কখনও মেমরিতে লোড হয়, সুতরাং আপনার ইন-মেমরির পদচিহ্নটি একইভাবে ছোট থাকে। সংকলনের সময় বিপুল সংখ্যক শিরোলেখ ফাইল যুক্ত করার জন্য, আর একবারও চিন্তা করবেন না। এক্সকোড সংকলনের সময়ের গতি বাড়ানোর জন্য একটি পূর্বনির্ধারিত শিরোনাম সুবিধা সরবরাহ করে। সমস্ত ফ্রেমওয়ার্ক শিরোনাম একবারে সংকলন করে, আপনি একটি নতুন ফ্রেমওয়ার্ক যুক্ত না করলে শিরোনামগুলি পুনরায় সংকলনের প্রয়োজন হবে না। এর মধ্যে, আপনি সামান্য বা কোনও পারফরম্যান্স পেনাল্টি সহ অন্তর্ভুক্ত ফ্রেমওয়ার্কগুলি থেকে যে কোনও ইন্টারফেস ব্যবহার করতে পারেন।

আমার ম্যাক্রোস-এও আমি প্রচুর ধ্রুবক যুক্ত করেছি:

// 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];

4
এখানে আর একটি দরকারী: #define async(...) dispatch_async(dispatch_get_main_queue(), __VA_ARGS__ )... মূল থ্রেডে ব্লক চালানোর জন্য:async(^{ self.someLabel.text = @":D"; });
আলেজান্দ্রো ইভান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.