আমি অনেক বিকাশকারীকে দেখেছি যা তাদের আইওএস প্রকল্পের প্রিফিক্স.পুচে বিভিন্ন সুবিধা ম্যাক্রো যুক্ত করে add
আইওএস প্রেফিক্স.পিচএইচ ফাইলটিতে আপনি কী যুক্ত করবেন (বা করবেন না)? আপনার Prefix.pch দেখতে কেমন?
আমি অনেক বিকাশকারীকে দেখেছি যা তাদের আইওএস প্রকল্পের প্রিফিক্স.পুচে বিভিন্ন সুবিধা ম্যাক্রো যুক্ত করে add
আইওএস প্রেফিক্স.পিচএইচ ফাইলটিতে আপনি কী যুক্ত করবেন (বা করবেন না)? আপনার Prefix.pch দেখতে কেমন?
Macros.h
, এবং তারপরে এই ফাইলটি আপনার মধ্যে আমদানি করুন prefix.pch
।
উত্তর:
ইভিউ ... একটি .pch ফাইলে ম্যাক্রোগুলি রাখবেন না! একটি .pch ফাইলটি সংজ্ঞা অনুসারে একটি প্রকল্প নির্দিষ্ট প্রাকম্পম্পাইল শিরোনাম। এটি সত্যিই প্রকল্পের প্রেক্ষাপটের বাইরে ব্যবহার করা উচিত নয় এবং এটিতে #include
এস এবং #import
এস ব্যতীত অন্য কিছু থাকা উচিত নয় ।
যদি আপনার কাছে কিছু ম্যাক্রো থাকে এবং এমন যে আপনি শিরোনামগুলির মধ্যে ভাগ করতে চান, তবে তাদের নিজের একটি হেডার ফাইল - Common.h
বা যাই হোক না কেন - এবং #include
যেটি .pch এর শুরুতে আটকে দিন stick
আধুনিক আইওএস এবং ওএস এক্সের জন্য, লোকদের মডিউলগুলি ব্যবহার করা উচিত । এটি নতুন প্রকল্পগুলির জন্য ডিফল্টরূপে সক্ষম হয় এবং আমদানি / অন্তর্ভুক্তি ব্যবহার করে সম্পন্ন হয় @import
।
মডিউলগুলি সংকলকটিকে মডিউলের সামগ্রীর (যেমন একটি ফ্রেমওয়ার্কের শিরোনাম) মধ্যবর্তী উপস্থাপনা তৈরি করার অনুমতি দেয়। অনেকটা পিএইচসি-র মতো, এই মধ্যবর্তী উপস্থাপনাটি একাধিক অনুবাদে ভাগ করা যেতে পারে। তবে মডিউলগুলি এটি আরও একধাপ এগিয়ে নেয় কারণ মডিউল অগত্যা নির্দিষ্ট নির্দিষ্ট নয় এবং তাদের ঘোষণাগুলি স্থানীয়করণের প্রয়োজন হয় না (ক *.pch
)। এই উপস্থাপনাটি আপনাকে একটি টন রিলান্ড্যান্ট কম্পাইলারের কাজ বাঁচাতে পারে।
মডিউলগুলি ব্যবহার করে, আপনার কোনও পিএইচসি প্রয়োজন হবে না এবং আপনার সম্ভবত তাদের সম্পূর্ণভাবে শেষ করে দেওয়া উচিত - @import
স্থানীয়তা নির্ভরতার জন্য ব্যবহার করার পক্ষে । সেক্ষেত্রে, একটি পিসিএইচ আপনাকে কেবল স্থানীয়ভাবে নির্ভরতাগুলিতে অন্তর্ভুক্তিগুলি টাইপ করা থেকে বাঁচাচ্ছে (কোন আইএমও আপনার হওয়া উচিত)।
এখন, আমরা যদি আসল প্রশ্নটির দিকে ফিরে তাকাই: আপনার সমস্ত প্রকারের এলোমেলো জিনিস দিয়ে আপনার পিএইচসি পূরণ করা উচিত নয়; ম্যাক্রোস, ধ্রুবক #defines
এবং সমস্ত ছোট ছোট লাইব্রেরি। সাধারণত, আপনার উত্স ফাইলগুলির বেশিরভাগের কাছে যা অপ্রয়োজনীয় তা বাদ দেওয়া উচিত । আপনার PCH- এ সমস্ত ধরণের স্টাফ রেখে কেবল ওজন এবং নির্ভরতার একগুচ্ছ যোগ করা হচ্ছে। আমি দেখতে পাচ্ছি যে লোকেরা তাদের লিঙ্ক করা সমস্ত কিছুই পিএইচসি-তে রাখে। বাস্তবে, সহায়ক ফ্রেমওয়ার্কগুলি সাধারণত বেশিরভাগ ক্ষেত্রে কয়েকটি অনুবাদে দৃশ্যমান হওয়া প্রয়োজন। যেমন "এখানে আমাদের StoreKit উপাদান - শুধুমাত্র আসুন আমদানি StoreKit যেখানে এটি অবশ্যইদৃশ্যমান হতে। বিশেষত, এই 3 টি অনুবাদ "। এটি আপনার নির্মাণের সময়কে কমিয়ে দেয় এবং আপনাকে আপনার নির্ভরতার উপর নজর রাখতে সহায়তা করে যাতে আপনি কোডটি আরও সহজেই পুনরায় ব্যবহার করতে পারেন an সুতরাং কোনও ওজেসি প্রকল্পে আপনি সাধারণত ফাউন্ডেশনে থামবেন If যদি অনেক কিছু থাকে ইউআই এর পরে আপনি আপনার পি সি সি-তে ইউআইকিট বা অ্যাপকিট যুক্ত করার বিষয়টি বিবেচনা করতে পারেন This এটি সমস্তই ধরে নেওয়া হচ্ছে আপনি বিল্ড টাইমগুলি অনুকূল করতে চান large বড় পিসিচিতে একটি সমস্যা রয়েছে যার মধ্যে প্রায় (প্রায়) সমস্ত কিছুই অন্তর্ভুক্ত যা অপ্রয়োজনীয় নির্ভরতা অপসারণ করা খুব সময়সাপেক্ষ। আপনার প্রকল্পের নির্ভরতা বৃদ্ধি পায় এবং আপনার বিল্ডিংয়ের সময় বাড়তে থাকে, আপনার বিল্ডিং সময়কে হ্রাস করার জন্য আপনাকে অপ্রয়োজনীয় নির্ভরতা দূরীকরণের সাথে লড়াই করতে হবে এবং এছাড়াও, সাধারণত যে পরিবর্তনগুলি সাধারণত ঘটে থাকে তা আপনার PCH এর বাইরে রাখা উচিত A পরিবর্তনের পুরো পুনর্নির্মাণের প্রয়োজন। PCHs ভাগ করার জন্য কিছু বিকল্প রয়েছে you আপনি যদি পিসিএইচ ব্যবহার করেন,
আমি আমার পিএইচসি-তে যতটুকু রেখেছি: আমি বহু বছর আগে লক্ষ্যমাত্রার বিশাল সংখ্যাগরিষ্ঠের জন্য সেগুলি ব্যবহার বন্ধ করে দিয়েছি। যোগ্যতা অর্জনের জন্য কেবল সেখানে পর্যাপ্ত পরিমাণে নেই। মনে রাখবেন, আমি সি ++, ওবিজেসি, ওবিজেসি ++ এবং সি লিখি - সংকলকটি আপনার টার্গেটে প্রতিটি ল্যাংয়ের জন্য একটির নিঃসরণ করে। সুতরাং এগুলি সক্ষম করার ফলে প্রায়শই ধীর সংকলনের সময় এবং উচ্চতর আই / ও হয়। শেষ পর্যন্ত, জটিল প্রকল্পগুলিতে নির্ভরতার বিরুদ্ধে লড়াই করার জন্য নির্ভরতা বাড়ানো ভাল উপায় নয়। একাধিক ভাষা / উপভাষার সাথে কাজ করা, একটি নির্দিষ্ট লক্ষ্যের জন্য প্রয়োজনীয় নির্ভরতাগুলির মধ্যে অনেক পার্থক্য রয়েছে। না, আমি এটি প্রতিটি প্রকল্পের জন্য অনুকূল হিসাবে পরামর্শ দেব না, তবে এটি বৃহত্তর প্রকল্পগুলিতে নির্ভরতা পরিচালনার ক্ষেত্রে কিছুটা দৃষ্টিভঙ্গি দেয়।
তথ্যসূত্র
মন্তব্য
#import "MyLib/MyLib.h"
। যে কোনও সময় কোনও ফাইল MyLib.h
পরিবর্তনের মাধ্যমে অন্তর্ভুক্ত করা হয় , অ্যাপ্লিকেশানের প্রতিটি উত্স ফাইলটি পুনরায় সংযুক্ত করতে হবে। আপনি যদি মাত্র একটি উত্স ফাইলে মাইলিব ব্যবহার করেন, তবে মাইলিব পরিবর্তিত হলে কেবল সেই ফাইলটি পুনরায় সংযুক্ত করতে হবে। বিশ্বাস করুন বা না করুন, আমি আজকাল কোনও PCH ফাইল ব্যবহার করছি না।
আমি বামবামের সাথে একমত আমার পিএইচসি ফাইলটি গ্রহণ করা হ'ল এটিতে কেবলমাত্র বিবৃতি #include
বা #import
বিবৃতি থাকতে হবে । সুতরাং যদি আপনার কাছে সহায়ক, উচ্চ-স্তরের ম্যাক্রোগুলি রয়েছে, তবে বুবামের পরামর্শ অনুসারে এগুলি Common.h
এবং #import
সেই ফাইলটিতে কোনও কিছু সংজ্ঞায়িত করুন ।
আমি সাধারণত একটি পদক্ষেপ আরো যেতে এবং PCH ফাইল ব্যবহার #import
নামক একটি ফাইল XXCategories.h
(যেখানে XX
যে আপনার ব্যবহার বর্গ নামকরণ উপসর্গ সম্মেলন হয়) #import
আমার UIKit এবং ফাউন্ডেশন বর্গ শ্রেণীর জন্য S: NSString+XXAdditions.h
, UIColor+XXAdditons.h
, ইত্যাদি
#import
এবং কেবল সেগুলি #import
সরাসরি আমদানি করতে পারে ? এগুলি কি একই হবে না?, বা এটি কোনও কার্যকারিতা প্রভাবিত করে?
#import
এবং এর জন্য হওয়া উচিত #include
।
একটি শিরোনাম ফাইল "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];
#define async(...) dispatch_async(dispatch_get_main_queue(), __VA_ARGS__ )
... মূল থ্রেডে ব্লক চালানোর জন্য:async(^{ self.someLabel.text = @":D"; });