উত্তর:
আমি এমন কয়েকটি জিনিস শুরু করতে শুরু করেছি যা আমি মানসম্মত বলে মনে করি না:
1) বৈশিষ্ট্যগুলির আগমনের সাথে, আমি আর "ব্যক্তিগত" শ্রেণীর ভেরিয়েবলের উপসর্গ করতে "_" ব্যবহার করি না। সর্বোপরি, যদি কোনও ভেরিয়েবল অন্যান্য শ্রেণি দ্বারা অ্যাক্সেস করা যায় তবে এর জন্য কোনও সম্পত্তি থাকা উচিত নয়? কোডটি কুরুচিপূর্ণ করার জন্য আমি সর্বদা "_" উপসর্গটি অপছন্দ করি এবং এখন আমি এটি ছেড়ে দিতে পারি।
2) ব্যক্তিগত জিনিসগুলির বিষয়ে কথা বলতে, আমি প্রাইভেট মেথডের সংজ্ঞাগুলি .m ফাইলের মধ্যে শ্রেণীর এক্সটেনশনে এভাবে রাখি prefer
#import "MyClass.h"
@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end
@implementation MyClass
বাইরের লোকদের যে বিষয়গুলির যত্ন নেওয়া উচিত নয় সেগুলি নিয়ে .h ফাইলটিকে কেন বিশৃঙ্খলা করা উচিত? খালি () .m ফাইলে ব্যক্তিগত বিভাগগুলির জন্য কাজ করে এবং আপনি যদি ঘোষিত পদ্ধতিগুলি প্রয়োগ না করেন তবে সতর্কতা সংকলন ইস্যু করে।
3) আমি @ সংশ্লেষিত নির্দেশাবলীর ঠিক নীচে .m ফাইলের শীর্ষে ডেলোক রেখেছি। আপনি যে ক্লাসে ভাবতে চান সেগুলির তালিকার শীর্ষে আপনার কী ডেলোক হওয়া উচিত নয়? আইফোনের মতো পরিবেশে এটি বিশেষভাবে সত্য।
৩.৩) সারণী কোষগুলিতে, প্রতিটি উপাদান (সেল নিজেই অন্তর্ভুক্ত) সম্পাদনের জন্য অস্বচ্ছ করুন। তার মানে প্রতিটি ক্ষেত্রে উপযুক্ত পটভূমির রঙ সেট করা।
৩.6) কোনও এনএসআরএল সংযোগ ব্যবহার করার সময়, একটি নিয়ম হিসাবে আপনি ডেলিগেট পদ্ধতিটি প্রয়োগ করতে পারেন:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
return nil;
}
আমি দেখতে পাই যে বেশিরভাগ ওয়েব কলগুলি খুব একবচন এবং এটি যে নিয়মের তুলনায় আপনি ক্যাশেড প্রতিক্রিয়া চাইবেন তার চেয়ে বেশি ব্যতিক্রম, বিশেষত ওয়েব পরিষেবা কলগুলির জন্য। প্রদর্শিত হিসাবে পদ্ধতিটি প্রয়োগ করা প্রতিক্রিয়াগুলির ক্যাচিং অক্ষম করে।
আগ্রহের বিষয়টি হ'ল জোসেফ ম্যাটিয়েলোর আইফোনের নির্দিষ্ট কিছু টিপস (একটি আইফোন মেলিং তালিকায় প্রাপ্ত)। আরও রয়েছে, তবে এগুলি সবচেয়ে কার্যকর যে আমি ভেবেছিলাম সেগুলি ছিল (দ্রষ্টব্য যে প্রতিক্রিয়ারগুলিতে প্রদত্ত বিবরণ অন্তর্ভুক্ত করার জন্য কয়েকটি বিট এখন মূল থেকে কিছুটা সম্পাদনা করা হয়েছে):
4) কেবলমাত্র যদি ডাবল নির্ভুলতা ব্যবহার করতে হয় তবে যেমন করলোকেশনের সাথে কাজ করার সময়। নিশ্চিত হয়ে নিন যে আপনি নিজের ধ্রুবককে 'চ' এ শেষ করে জিসিসি স্টোরকে ভাসমান হিসাবে তৈরি করুন।
float val = someFloat * 2.2f;
এটি বেশিরভাগ ক্ষেত্রে গুরুত্বপূর্ণ যখন someFloat
প্রকৃতপক্ষে দ্বৈত হতে পারে, আপনার মিশ্র-মোড গণিতের প্রয়োজন হবে না, যেহেতু আপনি স্টোরেজে 'ভাল' এর যথার্থতা হারাচ্ছেন। আইফোনগুলিতে হার্ডওয়্যারে ভাসমান-পয়েন্ট নম্বরগুলি সমর্থিত থাকলেও একক নির্ভুলতার বিপরীতে ডাবল-প্রসেসিং পাটিগণিত করতে আরও বেশি সময় লাগতে পারে। তথ্যসূত্র:
পুরানো ফোনগুলিতে গণনাগুলি একই গতিতে পরিচালিত হয় তবে আপনি রেজিস্টারগুলিতে দ্বিগুণের তুলনায় আরও একক নির্ভুলতা উপাদান রাখতে পারেন, তাই অনেকগুলি গণনার জন্য একক নির্ভুলতা দ্রুত শেষ হবে।
5) আপনার সম্পত্তি হিসাবে হিসাবে সেট করুন nonatomic
। সেগুলি atomic
ডিফল্টরূপে এবং সংশ্লেষণের ভিত্তিতে, মাল্টি-থ্রেডিং সমস্যাগুলি প্রতিরোধ করার জন্য সেমফোর কোড তৈরি করা হবে। আপনার 99% এর সম্ভবত এটি সম্পর্কে চিন্তা করার দরকার নেই এবং ননোটমিকের ক্ষেত্রে সেট করার সময় কোডটি খুব কম ফুলে যায় এবং আরও মেমরি-দক্ষ।
)) এসকিউএলাইট একটি বৃহত ডেটা সেট ক্যাশে করার খুব দ্রুত উপায় হতে পারে। উদাহরণস্বরূপ মানচিত্রের অ্যাপ্লিকেশনটি এর টাইলগুলি এসকিউএল ফাইলগুলিতে ক্যাশে করতে পারে। সবচেয়ে ব্যয়বহুল অংশটি ডিস্ক আই / ও / বড় ব্লকের প্রেরণে BEGIN;
এবং ছোট ছোট লেখাগুলি এড়িয়ে চলুন COMMIT;
। উদাহরণস্বরূপ আমরা একটি 2 সেকেন্ড টাইমার ব্যবহার করি যা প্রতিটি নতুন জমা দেওয়াতে পুনরায় সেট হয়। এটির মেয়াদ শেষ হয়ে গেলে, আমরা কমিট পাঠাই; , যার ফলে আপনার সমস্ত লেখক একটি বড় অংশে চলে যায়। এসকিউএলাইট লেনদেনের ডেটা ডিস্কে সঞ্চয় করে এবং এই প্রারম্ভ / সমাপ্তি মোড়ক করা সমস্ত লেনদেনের ফাইলগুলি একটি ফাইলে গ্রুপিং করে এড়িয়ে যায়।
এছাড়াও, এসকিউএল আপনার জিইউআই যদি আপনার মূল থ্রেডে অবরুদ্ধ করে। আপনার যদি খুব দীর্ঘ প্রশ্ন থাকে তবে আপনার প্রশ্নগুলি স্থির অবজেক্ট হিসাবে সংরক্ষণ করা এবং আপনার এসকিউএলকে পৃথক থ্রেডে চালানো ভাল ধারণা idea @synchronize() {}
ব্লকগুলিতে ক্যোয়ারী স্ট্রিংয়ের জন্য ডাটাবেসকে সংশোধন করে এমন কোনও কিছু মোড়ানো নিশ্চিত করুন । সংক্ষিপ্ত প্রশ্নের জন্য সহজ সুবিধার জন্য জিনিসগুলি মূল থ্রেডে রেখে দিন।
আরও এসকিউএলাইট অপ্টিমাইজেশান টিপস এখানে রয়েছে, যদিও নথির পুরানো উপস্থিত রয়েছে, অনেকগুলি পয়েন্ট সম্ভবত এখনও ভাল রয়েছে;
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
যখন পদ্ধতি বা ফাংশন কোনও ফর্ম্যাট স্ট্রিং আর্গুমেন্ট গ্রহণ করে, আপনার ফর্ম্যাট স্ট্রিংয়ের বিষয়বস্তুর উপর নিয়ন্ত্রণ রয়েছে তা নিশ্চিত হওয়া উচিত।
উদাহরণস্বরূপ, স্ট্রিংগুলি লগ করার সময়, স্ট্রিং ভেরিয়েবলটিকে একমাত্র যুক্তি হিসাবে প্রেরণা দিতে প্ররোচিত করে NSLog
:
NSString *aString = // get a string from somewhere;
NSLog(aString);
এটির সাথে সমস্যাটি হ'ল স্ট্রিংটিতে এমন অক্ষর থাকতে পারে যা ফর্ম্যাট স্ট্রিং হিসাবে ব্যাখ্যা করা হয়। এর ফলে ভ্রান্ত আউটপুট, ক্রাশ এবং সুরক্ষা সমস্যা দেখা দিতে পারে। পরিবর্তে, আপনার স্ট্রিং ভেরিয়েবলটি বিন্যাসের স্ট্রিংয়ের পরিবর্তে করা উচিত:
NSLog(@"%@", aString);
আপনি অন্য পরিবেশ থেকে যা ব্যবহার করেছেন তার চেয়ে স্ট্যান্ডার্ড কোকো নামকরণ এবং ফর্ম্যাটিং কনভেনশন এবং পরিভাষা ব্যবহার করুন। সেখানে হয় সেখানে আউট কোকো ডেভেলপারদের প্রচুর, এবং যখন তাদের অন্য এক আপনার কোড সঙ্গে কাজ শুরু হয়, তা অনেক বেশী সহজগম্য হবেন যদি এটা দেখায় এবং অন্যান্য কোকো কোড অনুরূপ মতানুযায়ী।
কী করবেন এবং কী করবেন না তার উদাহরণ:
id m_something;
কোনও অবজেক্টের ইন্টারফেসে ঘোষণা করবেন না এবং এটিকে সদস্য পরিবর্তনশীল বা ক্ষেত্র বলবেন না ; ব্যবহার করুন something
বা _something
এর নামের জন্য এবং এটিকে উদাহরণ পরিবর্তনশীল বলুন ।-getSomething
; সঠিক কোকো নাম ঠিক -something
।-something:
; এটা করা উচিত-setSomething:
-[NSObject performSelector:withObject:]
, না NSObject::performSelector
।আপনি যা যা করেন না কেন, Win16 / Win32- স্টাইলের হাঙ্গেরিয়ান স্বরলিপি ব্যবহার করবেন না । এমনকি মাইক্রোসফ্ট .NET প্ল্যাটফর্মে চলে যাওয়ার সাথে সাথে এটি ছেড়ে দিয়েছে।
.তিহাসিকভাবে, আউটলেটগুলির মেমরি পরিচালনা খুব খারাপ। বর্তমান সেরা অনুশীলন হ'ল আউটলেটগুলি সম্পত্তি হিসাবে ঘোষণা করা:
@interface MyClass :NSObject {
NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end
বৈশিষ্ট্য ব্যবহার করে মেমরি পরিচালন শব্দার্থকে পরিষ্কার করে তোলে; যদি আপনি উদাহরণ পরিবর্তনশীল সংশ্লেষণ ব্যবহার করেন তবে এটি একটি সামঞ্জস্যপূর্ণ প্যাটার্নও সরবরাহ করে।
দ্রষ্টব্য: এক্সকোড 4 এর অধীনে এটি এখন আইডিইতে অন্তর্নির্মিত।
আপনি অনাকাঙ্ক্ষিতভাবে - ম্যাক ওএস এক্স 10.5 তে আপনার সি এবং অবজেক্টিভ-সি কোড (এখনও কোনও সি ++ নেই) বিশ্লেষণ করতে ক্ল্যাং স্ট্যাটিক বিশ্লেষক ব্যবহার করেন । এটি ইনস্টল এবং ব্যবহার করা তুচ্ছ:
cd
থেকে আপনার প্রকল্প ডিরেক্টরিতে।scan-build -k -V xcodebuild
।(কিছু অতিরিক্ত প্রতিবন্ধকতা ইত্যাদি রয়েছে, বিশেষত আপনার "ডিবাগ" কনফিগারেশনে আপনার কোনও প্রকল্প বিশ্লেষণ করা উচিত - বিশদের জন্য http://clang.llvm.org/StaticAnalysisUsage.html দেখুন - তবে এটি কম-বেশি বা কম এটি কীভাবে ফুটে যায়।)
এরপরে বিশ্লেষক আপনার জন্য ওয়েব পৃষ্ঠাগুলির একটি সেট তৈরি করে যা সম্ভবত মেমরি পরিচালনা এবং অন্যান্য প্রাথমিক সমস্যাগুলি দেখায় যা সংকলক সনাক্ত করতে অক্ষম।
এটি সূক্ষ্ম এক কিন্তু কার্যকর এক। যদি আপনি নিজেকে অন্য কোনও জিনিসের প্রতিনিধি হিসাবে পাস করেন তবে সেই বস্তুর প্রতিনিধিটিকে আপনার আগে পুনরায় সেট করুন dealloc
।
- (void)dealloc
{
self.someObject.delegate = NULL;
self.someObject = NULL;
//
[super dealloc];
}
এটি করে আপনি নিশ্চিত করে নিচ্ছেন যে আর কোনও প্রতিনিধি পদ্ধতি প্রেরণ করা হবে না। আপনি dealloc
যখন ইথারে যাচ্ছেন এবং অদৃশ্য হয়ে যাওয়ার পরে আপনি নিশ্চিত করতে চান যে দুর্ঘটনাক্রমে কোনও কিছুই আপনাকে আর কোনও বার্তা প্রেরণ করতে পারে না। মনে রাখবেন স্ব.সোমঅবজেক্টটি অন্য কোনও অবজেক্টের দ্বারা ধরে রাখা যেতে পারে (এটি একটি সিঙ্গলটন বা স্বতঃস্ফূর্ত পুলে বা যে কোনও কিছু হতে পারে) এবং আপনি এটি "আমাকে বার্তা প্রেরণ বন্ধ না করুন!" না হওয়া পর্যন্ত এটি মনে করে যে আপনার আপস-অবলম্বন করা অবজেক্ট সুষ্ঠু খেলা।
এই অভ্যাসে প্রবেশ করা আপনাকে প্রচুর অদ্ভুত ক্রাশ থেকে রক্ষা করবে যা ডিবাগ করার জন্য ব্যথা।
মূল অধ্যয়ন এবং এনএসএনটিফিকেশনগুলিতেও একই অধ্যক্ষ প্রযোজ্য।
সম্পাদনা:
আরও বেশি রক্ষণাত্মক, পরিবর্তন করুন:
self.someObject.delegate = NULL;
মধ্যে:
if (self.someObject.delegate == self)
self.someObject.delegate = NULL;
Memory Management Programming Guide for Cocoa
: Additional cases of weak references in Cocoa include, but are not restricted to, table data sources, outline view items, notification observers, and miscellaneous targets and delegates. In most cases, the weak-referenced object is aware of the other object’s weak reference to it, as is the case for circular references, and is responsible for notifying the other object when it deallocates.
@kendell
পরিবর্তে:
@interface MyClass (private)
- (void) someMethod
- (void) someOtherMethod
@end
ব্যবহার করুন:
@interface MyClass ()
- (void) someMethod
- (void) someOtherMethod
@end
উদ্দেশ্য-সি 2.0 তে নতুন।
ক্লাস এক্সটেনশানগুলি অ্যাপলের উদ্দেশ্য-সি 2.0 রেফারেন্সে বর্ণিত হয়েছে described
"ক্লাস এক্সটেনশানগুলি আপনাকে প্রাথমিক শ্রেণীর @ অভ্যন্তরীণ ব্লকের বাইরে অন্য জায়গাগুলিতে কোনও শ্রেণীর জন্য অতিরিক্ত প্রয়োজনীয় এপিআই ঘোষণা করার অনুমতি দেয়"
সুতরাং তারা প্রকৃত শ্রেণির অংশ - এবং ক্লাস ছাড়াও একটি (প্রাইভেট) বিভাগ নয়। সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য।
()
পরিবর্তে ব্যবহার করার পরিবর্তে একটি গুরুত্বপূর্ণ সুবিধা রয়েছে (Private)
: আপনি কেবলমাত্র পঠনযোগ্য জনসাধারণের কাছে পাঠ্য রচনা হিসাবে বৈশিষ্ট্যগুলি পুনরায় বিবরণ করতে পারেন। :)
যেহেতু সাধারণত (1) তাদের জীবদ্দশায় সরাসরি নিয়ন্ত্রণ না থাকে তাই স্বতঃস্ফূর্ত বিষয়গুলি তুলনামূলকভাবে দীর্ঘ সময় ধরে থাকতে পারে এবং অযথা আপনার আবেদনের মেমরির পদচিহ্ন বাড়িয়ে তুলতে পারে। ডেস্কটপে এই সামান্য পরিণতি হতে পারে, আরও সীমাবদ্ধ প্ল্যাটফর্মগুলিতে এটি একটি উল্লেখযোগ্য সমস্যা হতে পারে। সমস্ত প্ল্যাটফর্মগুলিতে, এবং বিশেষত আরও সংকীর্ণ প্ল্যাটফর্মে, এমন পদ্ধতি ব্যবহার না করা ভাল অনুশীলন হিসাবে বিবেচনা করা হয় যা স্বতঃস্ফূর্ত অবজেক্টগুলির দিকে পরিচালিত করে এবং পরিবর্তে আপনাকে বরাদ্দ / আরআর প্যাটার্ন ব্যবহার করতে উত্সাহিত করা হয়।
সুতরাং, পরিবর্তে:
aVariable = [AClass convenienceMethod];
যেখানে সক্ষম, আপনার পরিবর্তে ব্যবহার করা উচিত:
aVariable = [[AClass alloc] init];
// do things with aVariable
[aVariable release];
যখন আপনি নিজের পদ্ধতিগুলি লিখেছেন যা সদ্য তৈরি হওয়া অবজেক্টটি ফিরিয়ে দেয়, আপনি কোকো নামকরণের কনভেনশনটি রিসিভারকে পতাকাঙ্কিত করতে পারেন যে এটি "নতুন" দিয়ে পদ্ধতির নামটি প্রেরণ করে প্রকাশ করা উচিত।
সুতরাং, পরিবর্তে:
- (MyClass *)convenienceMethod {
MyClass *instance = [[[self alloc] init] autorelease];
// configure instance
return instance;
}
আপনি লিখতে পারেন:
- (MyClass *)newInstance {
MyClass *instance = [[self alloc] init];
// configure instance
return instance;
}
যেহেতু পদ্ধতির নামটি "নতুন" দিয়ে শুরু হয়, আপনার এপিআইর গ্রাহকরাnewObject
জানেন যে তারা প্রাপ্ত প্রাপ্ত বস্তুটি মুক্তি দেওয়ার জন্য দায়বদ্ধ (উদাহরণস্বরূপ, এনএসবজেক্টকন্ট্রোলারের পদ্ধতিটি দেখুন )।
(1) আপনি নিজের স্থানীয় অটোরিলেস পুল ব্যবহার করে নিয়ন্ত্রণ নিতে পারেন। এ সম্পর্কে আরও তথ্যের জন্য অটোরিলেজ পুলগুলি দেখুন ।
NSAutoreleasePool
। তবে কেবলমাত্র আপনি নিশ্চিত করেছেন যে এটি আসলেই একটি সমস্যা। অকাল অপ্টিমাইজেশান এবং সব যে ...
এর মধ্যে কয়েকটি ইতিমধ্যে উল্লেখ করা হয়েছে, তবে আমি এখানে আমার মাথার উপরের অংশটি সম্পর্কে কী ভাবতে পারি:
#pragma mark [section]
। সাধারণত আমি আমার নিজস্ব পদ্ধতি, প্রতিটি সাবক্লাসের ওভাররাইড এবং কোনও তথ্য বা আনুষ্ঠানিক প্রোটোকল দ্বারা গ্রুপ করি। এটি আমি যা খুঁজছি ঠিক তার দিকে ঝাঁপিয়ে পড়া অনেক সহজ করে তোলে। একই বিষয়ে, একই রকমের গ্রুপগুলি (টেবিল ভিউয়ের প্রতিনিধি পদ্ধতিগুলির মতো) একসাথে গোষ্ঠীভুক্ত করুন, কেবল এটিকে কোথাও আটকে রাখবেন না।#define
উইল তৈরির সময় আইভারা তৈরি করা বা ডাটা ব্যবহারের সময় প্রতিটি বার এটি বাছাইয়ের পরিবর্তে একটি অ্যারে ক্যাশে করা। আমি এটি সম্পর্কে অনেক কিছুই বলতে পারি, তবে নীচের লাইনে আপনার প্রয়োজন না হওয়া পর্যন্ত কোড লেখা হয় না বা প্রোফাইলার আপনাকে বলে। এটি দীর্ঘমেয়াদে বজায় রাখা জিনিসগুলিকে অনেক সহজ করে তোলে।NSLog( @"stub" )
তবে এটি কেবল ভিতরে রেখেই এটি নির্দেশ করুন বা আপনি কোনও জিনিস রাখতে চান।Finish what you start
আপনি সম্পূর্ণ // TODO:
করার জন্য কোড চিহ্নিত করতেও ব্যবহার করতে পারেন যা ড্রপ ডাউনতে প্রদর্শিত হবে।
ইউনিট পরীক্ষা লিখুন। আপনি কোকোতে প্রচুর পরিমাণে পরীক্ষা করতে পারেন যা অন্যান্য ফ্রেমওয়ার্কগুলিতে আরও শক্ত হতে পারে। উদাহরণস্বরূপ, ইউআই কোডের সাহায্যে আপনি সাধারণত যাচাই করতে পারেন যে জিনিসগুলি যেমন সংযুক্ত রয়েছে তেমন হওয়া উচিত এবং বিশ্বাস করা উচিত যে তারা ব্যবহার করার সময় কাজ করবে। এবং আপনি রাষ্ট্র নির্ধারণ করতে পারেন এবং তাদের পরীক্ষার জন্য প্রতিনিধি পদ্ধতিগুলি সহজেই আবেদন করতে পারেন।
আপনার নিজের অভ্যন্তরগুলির জন্য পরীক্ষার লেখার পথে পাবলিক বনাম সুরক্ষিত বনাম ব্যক্তিগত পদ্ধতির দৃশ্যমানতাও নেই don't
সুবর্ণ নিয়ম: আপনি যদি alloc
তাই হয় release
!
আপডেট: আপনি যদি আরসি ব্যবহার না করেন তবে
copy
, mutableCopy
, new
বা retain
।
উদ্দেশ্য-সি লিখবেন না যেন এটি জাভা / সি # / সি ++ / ইত্যাদি +
আমি একবার দেখেছি যে একটি দল জাভা EE ওয়েব অ্যাপ্লিকেশনগুলি লেখার জন্য ব্যবহৃত হয়েছিল, তারা কোকো ডেস্কটপ অ্যাপ্লিকেশন লেখার চেষ্টা করছে। যেন এটি জাভা ইই ওয়েব অ্যাপ্লিকেশন। সেখানে অনেকগুলি অ্যাবস্ট্রাকফুফ্যাক্টরি এবং ফুফ্যাক্টরী এবং আইফু এবং ফু ছিল যখন তাদের সত্যিই দরকার ছিল কেবল একটি ফু ক্লাস এবং সম্ভবত একটি ফুয়েবল প্রোটোকল।
আপনি এটি না করেন তা নিশ্চিত করার অংশটি হ'ল ভাষার পার্থক্যগুলি বোঝা। উদাহরণস্বরূপ, আপনার উপরের বিমূর্ত ফ্যাক্টরি এবং কারখানার ক্লাসগুলির প্রয়োজন নেই কারণ অবজেক্টিভ-সি ক্লাসের পদ্ধতিগুলি যেমন উদাহরণের মতো গতিময়ভাবে প্রেরণ করা হয় এবং সাবক্লাসে ওভাররাইড করা যায় can
নিশ্চিত করুন যে আপনি ডিবাগিং ম্যাজিক পৃষ্ঠাটি বুকমার্ক করেছেন । কোকো বাগের উত্স খোঁজার চেষ্টা করার সময় কোনও প্রাচীরের বিরুদ্ধে মাথা ঘোরানোর সময় এটি আপনার প্রথম স্টপ হওয়া উচিত।
উদাহরণস্বরূপ, এটি আপনাকে সেই পদ্ধতিটি কীভাবে খুঁজে পাবে যেখানে আপনি প্রথমে মেমরি বরাদ্দ করেছিলেন যা পরবর্তীতে ক্রাশ ঘটছে (অ্যাপ্লিকেশন সমাপ্তির সময়)।
আমি এখন নিউবাইক্যাটোরিকোহোলিজম কল করার সিদ্ধান্ত নিয়েছি তা এড়াতে চেষ্টা করুন। অবজেক্টিভ-সি-তে নতুন আগত ব্যক্তিরা যখন বিভাগগুলি আবিষ্কার করেন তারা প্রায়শই অস্তিত্বশীল প্রতিটি শ্রেণীর জন্য দরকারী ছোট বিভাগ যুক্ত করে ( "কী? আমি কোনও সংখ্যাকে রোমান সংখ্যায় এনএসএনবার্কে রূপান্তর করতে একটি পদ্ধতি যুক্ত করতে পারি!" )।
এটি করবেন না।
আপনার কোডটি দুই ডজন ফাউন্ডেশন ক্লাসের শীর্ষে ছড়িয়ে ছিটিয়ে থাকা কয়েক ডজন ছোট বিভাগের পদ্ধতি দিয়ে বোঝা আরও পোর্টেবল এবং সহজ হবে।
বেশিরভাগ সময় যখন আপনি সত্যিই ভাবেন যে কিছু কোড প্রবাহিত করতে আপনার কোনও বিভাগের পদ্ধতি প্রয়োজন তখন আপনি দেখতে পাবেন যে আপনি কখনই পদ্ধতিটি পুনরায় ব্যবহার করবেন না।
অন্যান্য বিপদগুলিও রয়েছে, যদি না আপনি নিজের বিভাগের পদ্ধতিগুলির নাম উল্লেখ করেন (এবং সম্পূর্ণ উন্মাদ ডিড্রবিন ছাড়া কে হবেন?) অ্যাপল, বা প্লাগইন, বা আপনার ঠিকানার জায়গাতে চলমান অন্য কোনও কিছুও একই বিভাগটি সংজ্ঞায়িত করবে unless কিছুটা ভিন্ন পার্শ্ব প্রতিক্রিয়া সহ একই নামের পদ্ধতি ...
ঠিক আছে. এখন আপনাকে সতর্ক করা হয়েছে, "এই অংশটি করবেন না" উপেক্ষা করুন। তবে চরম সংযম অনুশীলন করুন।
বিশ্বকে সাবক্লাসিংয়ের বিরুদ্ধে প্রতিরোধ করুন। কোকোতে প্রতিনিধি এবং অন্তর্নিহিত রানটাইম ব্যবহারের মাধ্যমে অনেক কিছু করা হয় যা অন্যান্য ফ্রেমওয়ার্কগুলিতে সাবক্লাসিংয়ের মাধ্যমে করা হয়।
উদাহরণস্বরূপ, জাভাতে আপনি বেনামে *Listener
সাবক্লাসগুলির উদাহরণগুলি প্রচুর ব্যবহার করেন এবং .NET এ আপনি আপনার EventArgs
সাবক্লাসগুলি প্রচুর ব্যবহার করেন । কোকোতে, আপনিও করবেন না - পরিবর্তে লক্ষ্য-ক্রিয়া ব্যবহৃত হয়।
যখন আপনি ব্যবহারকারীর কাছে উপস্থাপনের জন্য স্ট্রিংগুলি সাজান, আপনার সহজ compare:
পদ্ধতিটি ব্যবহার করা উচিত নয় । পরিবর্তে, আপনার সর্বদা স্থানীয় তুলনা পদ্ধতি যেমন localizedCompare:
বা হিসাবে ব্যবহার করা উচিত localizedCaseInsensitiveCompare:
।
আরও বিশদের জন্য অনুসন্ধানগুলি, তুলনা এবং স্ট্রিংগুলি বাছাই করুন ।
আপনার সমস্ত বৈশিষ্ট্যের জন্য সাধারণত আপনার উদ্দেশ্য-সি 2.0 ডিক্লেয়ারড প্রোপার্টি বৈশিষ্ট্যটি ব্যবহার করা উচিত। যদি তারা সর্বজনীন না হয় তবে তাদের একটি শ্রেণিবদ্ধকরণে যুক্ত করুন। ঘোষিত বৈশিষ্ট্যগুলি ব্যবহারের ফলে মেমরি পরিচালনার শব্দার্থগুলি তাত্ক্ষণিকভাবে পরিষ্কার হয়ে যায়, এবং আপনার ডেলোক পদ্ধতিটি পরীক্ষা করা আপনার পক্ষে সহজ করে তোলে - যদি আপনি আপনার সম্পত্তি সংক্রান্ত ঘোষণাগুলি একসাথে গ্রুপ করেন তবে আপনি সেগুলি দ্রুত স্ক্যান করতে পারেন এবং আপনার ডেলোক পদ্ধতি প্রয়োগের সাথে তুলনা করতে পারেন।
বৈশিষ্ট্যগুলিকে 'ননোটমিক' হিসাবে চিহ্নিত না করার আগে আপনার কঠোর চিন্তা করা উচিত। হিসাবে উদ্দেশ্য C প্রোগ্রামিং ভাষা গাইড নোট, বৈশিষ্ট্য ডিফল্টভাবে পারমাণবিক হয়, এবং বহন করতে যথেষ্ট ওভারহেড। তদতিরিক্ত, কেবল আপনার সমস্ত সম্পত্তি পরমাণু তৈরি করা আপনার অ্যাপ্লিকেশনটির থ্রেড-নিরাপদ করে না। অবশ্যই মনে রাখবেন যে আপনি যদি 'নন্যাটমিক' নির্দিষ্ট না করে থাকেন এবং নিজের অ্যাক্সেসর পদ্ধতিগুলি প্রয়োগ করেন (সেগুলি সংশ্লেষিত করার পরিবর্তে) তবে আপনাকে অবশ্যই এটি পরমাণু ফ্যাশনে প্রয়োগ করতে হবে।
যেহেতু এই প্রশ্নটি নোট করে, বার্তাগুলি nil
উদ্দেশ্য-সিটিতে বৈধ। যদিও এটি প্রায়শই একটি সুবিধা - ক্লিনার এবং আরও প্রাকৃতিক কোডের দিকে পরিচালিত করে - বৈশিষ্ট্যটি মাঝে মধ্যে অদ্ভুত এবং কঠিন-থেকে-ট্র্যাক-ডাউন বাগগুলিতে নিয়ে যেতে nil
পারে যখন আপনি এটির প্রত্যাশা না করে যখন কোনও মান পান।
এনএসএসর্ট এবং বন্ধুরা ব্যবহার করুন। আমি সর্বদা নীলকে বৈধ অবজেক্ট হিসাবে ব্যবহার করি ... বিশেষত নীলকে বার্তা প্রেরণ ওবজ-সি-তে পুরোপুরি বৈধ। তবে যদি আমি সত্যিই কোনও ভেরিয়েবলের অবস্থা সম্পর্কে নিশ্চিত করতে চাই তবে আমি এনএসএসর্ট এবং এনএসপিআরমিটারস্রেট ব্যবহার করি যা সমস্যাগুলি সহজেই খুঁজে পেতে সহায়তা করে।
সাধারণ কিন্তু একটানা ভুলে যাওয়া এক। অনুমান অনুসারে:
সাধারণভাবে, বিভিন্ন শ্রেণীর যে পদ্ধতিগুলিতে একই নির্বাচক (একই নাম) থাকে তাদের একই রিটার্ন এবং যুক্তির ধরণগুলিও ভাগ করতে হবে। এই সীমাবদ্ধতা গতিশীল বাঁধাই অনুমতি সংকলক দ্বারা আরোপিত হয়।
এক্ষেত্রে একই নামযুক্ত সমস্ত নির্বাচক, এমনকি বিভিন্ন শ্রেণিতে হলেও , একই রকম রিটার্ন / আর্গুমেন্টের ধরণ হিসাবে বিবেচিত হবে। এখানে একটি সহজ উদাহরণ।
@interface FooInt:NSObject{}
-(int) print;
@end
@implementation FooInt
-(int) print{
return 5;
}
@end
@interface FooFloat:NSObject{}
-(float) print;
@end
@implementation FooFloat
-(float) print{
return 3.3;
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
id f1=[[FooFloat alloc]init];
//prints 0, runtime considers [f1 print] to return int, as f1's type is "id" and FooInt precedes FooBar
NSLog(@"%f",[f1 print]);
FooFloat* f2=[[FooFloat alloc]init];
//prints 3.3 expectedly as the static type is FooFloat
NSLog(@"%f",[f2 print]);
[f1 release];
[f2 release]
[pool drain];
return 0;
}
আপনি যদি চিতাবাঘ (ম্যাক ওএস এক্স 10.5) বা তার পরে ব্যবহার করে থাকেন তবে মেমরি ফাঁসগুলি সন্ধান করতে এবং ট্র্যাক করতে আপনি ইনস্ট্রুমেন্টস অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন। এক্সকোডে আপনার প্রোগ্রামটি তৈরি করার পরে, রান> পারফরম্যান্স সরঞ্জাম দিয়ে শুরু করুন> লিক নির্বাচন করুন।
এমনকি যদি আপনার অ্যাপ্লিকেশন কোনও ফাঁস না দেখায় তবে আপনি খুব বেশি দীর্ঘ অবজেক্টগুলি রাখছেন। ইন্সট্রুমেন্টগুলিতে, আপনি এর জন্য অবজেক্টআলোক যন্ত্রটি ব্যবহার করতে পারেন। আপনার ইন্সট্রুমেন্টস ডকুমেন্টে অবজেক্টএলোক যন্ত্রটি নির্বাচন করুন এবং ভিউ> বিশদ (এটির পাশের একটি চেক চিহ্ন থাকা উচিত) চয়ন করে উপকরণটির বিশদটি (যদি এটি ইতিমধ্যে প্রদর্শিত না হয়) আনুন। অবজেক্টআলোক বিশদে "বরাদ্দ জীবনকাল" এর অধীনে, আপনি "তৈরি এবং এখনও জীবিত" -এর পাশের রেডিও বোতামটি চয়ন করেছেন তা নিশ্চিত করুন।
এখন যখনই আপনি আপনার অ্যাপ্লিকেশন রেকর্ডিং বন্ধ করবেন, অবজেক্টএলোক সরঞ্জামটি নির্বাচন করা আপনাকে "# নেট" কলামে আপনার অ্যাপ্লিকেশনের প্রতিটি স্থির-জীবিত অবজেক্টের জন্য কতগুলি রেফারেন্স রয়েছে তা দেখায়। নিশ্চিত করুন যে আপনি কেবল নিজের ক্লাসগুলিতেই নয়, আপনার এনআইবি ফাইলগুলির শীর্ষ-স্তরের অবজেক্টের ক্লাসগুলিও দেখেছেন Make উদাহরণস্বরূপ, যদি স্ক্রিনে আপনার কোনও উইন্ডো না থাকে এবং আপনি স্থায়ী এনএসউইন্ডোর উল্লেখ দেখতে পান তবে আপনি এটি আপনার কোডে প্রকাশ করেন নি।
Dealloc এ পরিষ্কার করুন।
এটি ভুলে যাওয়া সহজ জিনিসগুলির মধ্যে একটি - এসএসপি। 150mph এ কোডিং করার সময়। সর্বদা, সর্বদা, সর্বদা আপনার গুণাবলী / সদস্য ভেরিয়েবলগুলি ডেললকে পরিষ্কার করুন।
আমি নতুন ডট স্বরলিপি সহ - ওবিজেসি 2 বৈশিষ্ট্যগুলি ব্যবহার করতে চাই - সুতরাং এটি ক্লিনআপটিকে ব্যথাহীন করে তোলে। প্রায়শই সহজ:
- (void)dealloc
{
self.someAttribute = NULL;
[super dealloc];
}
(- আরও dealloc নিচে ক্ষেত্রে অন্য পদ্ধতি সদস্য পরিবর্তনশীল আবার ব্যবহারের - যা আমি আত্মরক্ষামূলক প্রোগ্রামিং বিবেচনা দুর্লভ কিন্তু এটি আপনার জন্য মুক্তির যত্ন নিতে হবে এবং শূন্য থেকে অ্যাট্রিবিউট সেট পারে ঘটতে)।
জিসি 10.5-এ চালু হওয়ার সাথে এর আর বেশি প্রয়োজন নেই - তবে আপনার নিজের তৈরি অন্যান্য সংস্থানগুলি পরিষ্কার করার দরকার হতে পারে, পরিবর্তে চূড়ান্তকরণ পদ্ধতিতে আপনি এটি করতে পারেন।
এই সমস্ত মন্তব্য দুর্দান্ত, কিন্তু আমি সত্যিই অবাক হয়েছি কেউ গুগলের উদ্দেশ্য-সি স্টাইল গাইড উল্লেখ করেনি যা কিছুক্ষণ আগে প্রকাশিত হয়েছিল। আমি মনে করি তারা খুব নিখুঁত কাজ করেছে job
এছাড়াও, আধা-সম্পর্কিত বিষয় (আরও প্রতিক্রিয়ার জন্য জায়গা সহ!):
এই ছোট্ট এক্সকোড টিপস এবং কৌশলগুলি কী কী আপনি চান যে আপনি প্রায় 2 বছর আগে জানতেন? ।
কোনও শিক্ষানবিশকে ব্যবহার করার পরিবর্তে সুস্পষ্ট একটি: আপনার কোডের জন্য এক্সকোডের অটো-ইন্ডেন্টেশন বৈশিষ্ট্যটি ব্যবহার করুন। এমনকি আপনি যদি অন্য কোনও উত্স থেকে অনুলিপি / আটকানো হয়ে থাকেন তবে একবার আপনি কোডটি আটকানো হয়ে গেলে আপনি কোডের পুরো ব্লকটি নির্বাচন করতে পারেন, এটিতে ডান ক্লিক করুন এবং তারপরে সেই ব্লকের মধ্যে থাকা সমস্ত কিছুকে পুনরায় ইনডেন্ট করার বিকল্পটি বেছে নিতে পারেন।
এক্সকোড প্রকৃতপক্ষে that বিভাগটি বিশ্লেষণ করবে এবং এটি বন্ধনী, লুপ ইত্যাদির উপর ভিত্তি করে প্রবর্তন করবে এবং প্রতিটি লাইনটির জন্য স্পেস বার বা ট্যাব কী চাপানোর চেয়ে অনেক বেশি দক্ষ।
আমি জানি প্রথম যখন কোকো প্রোগ্রামিংয়ের সাথে প্রবেশ করলাম তখন আমি এটিকে উপেক্ষা করেছি।
নিশ্চিত হয়ে নিন যে আপনি এনআইবি ফাইল সম্পর্কিত মেমরি পরিচালনার দায়িত্বগুলি বোঝে। আপনার লোড হওয়া কোনও এনআইবি ফাইলের শীর্ষ স্তরের অবজেক্টগুলি মুক্ত করার জন্য আপনি দায়বদ্ধ। বিষয়টিতে অ্যাপলের ডকুমেন্টেশন পড়ুন ।
সমস্ত জিসিসির সতর্কতাগুলি চালু করুন, তারপরে অ্যাপল এর শিরোনামগুলি নিয়মিত গোলমাল হ্রাস করার কারণে সেগুলি বন্ধ করুন।
ঝনঝন স্থির বিশ্লেষণ ঘন ঘন চালান; আপনি "রান স্ট্যাটিক বিশ্লেষক" বিল্ড সেটিংসের মাধ্যমে সমস্ত বিল্ডের জন্য এটি সক্ষম করতে পারেন।
ইউনিট পরীক্ষা লিখুন এবং প্রতিটি বিল্ড দিয়ে তাদের চালান।
চলক এবং বৈশিষ্ট্য
1 / আপনার শিরোনাম পরিষ্কার রাখা, বাস্তবায়ন গোপন
করা আপনার শিরোনামে উদাহরণ পরিবর্তনগুলি অন্তর্ভুক্ত করবেন না। প্রাইভেট ভেরিয়েবলগুলি সম্পত্তি হিসাবে শ্রেণি ধারাবাহিকতায় রাখে। পাবলিক ভেরিয়েবলগুলি আপনার শিরোনামে সর্বজনীন বৈশিষ্ট্য হিসাবে ঘোষণা করে। যদি এটি কেবল পঠনযোগ্য হয় তবে এটিকে কেবল পঠন হিসাবে ঘোষণা করুন এবং শ্রেণিবিন্যাসের পাঠ্য রচনা হিসাবে এটি ওভাররাইট করুন। মূলত আমি ভেরিয়েবলগুলি মোটেই ব্যবহার করছি না, কেবলমাত্র বৈশিষ্ট্য।
2 / আপনার সম্পত্তিগুলিকে একটি ডিফল্ট পরিবর্তনশীল নাম দিন, উদাহরণস্বরূপ:
@synthesize property = property_;
কারণ 1: আপনি "স্ব" ভুলে গিয়ে ত্রুটিগুলি ধরা পাবেন। সম্পত্তি বরাদ্দ করার সময়। কারণ 2: আমার পরীক্ষাগুলি থেকে, সরঞ্জামগুলিতে ফাঁস বিশ্লেষকের ডিফল্ট নাম সহ সম্পত্তি ফাঁস সনাক্ত করতে সমস্যা আছে।
3 / কখনও কখনও সম্পত্তি (বা শুধুমাত্র খুব ব্যতিক্রমী পরিস্থিতিতে) সরাসরি সংরক্ষণ বা মুক্তি ব্যবহার করবেন না। আপনার dealloc এ কেবল তাদের শূন্য করা। পুনরুদ্ধার বৈশিষ্ট্যগুলি নিজেরাই ধরে রাখা / প্রকাশ করা পরিচালনা করতে বোঝায়। কোনও সেটটার না থাকলে আপনি কখনই জানেন না, উদাহরণস্বরূপ, পর্যবেক্ষক যুক্ত করা বা অপসারণ করতে। আপনার ভেরিয়েবলটি কেবলমাত্র তার সেটার এবং গেটরের ভিতরেই ব্যবহার করা উচিত।
দেখেছে
1 / প্রতিটি ভিউ সংজ্ঞাটি একটি xib এ রাখুন, যদি আপনি পারেন (ব্যতিক্রমটি সাধারণত গতিশীল সামগ্রী এবং স্তর সেটিংস হয়)। এটি সময় সাশ্রয় করে (কোড লেখার চেয়ে সহজ), এটি পরিবর্তন করা সহজ এবং এটি আপনার কোডটি পরিষ্কার রাখে।
2 / দেখার সংখ্যা হ্রাস করে মতামতগুলি অনুকূল করার চেষ্টা করবেন না। Xib এর পরিবর্তে আপনার কোডে ইউআইআইমেজভিউ তৈরি করবেন না কারণ আপনি এতে সাবভিউ যুক্ত করতে চান। পরিবর্তে ইউআইআইমেজভিউটি ব্যাকগ্রাউন্ড হিসাবে ব্যবহার করুন। ভিউ ফ্রেমওয়ার্কটি সমস্যা ছাড়াই শত শত ভিউগুলি পরিচালনা করতে পারে।
3 / আইবিআউটলেটগুলি সর্বদা বজায় রাখতে হবে না (বা শক্তিশালী)। মনে রাখবেন যে আপনার বেশিরভাগ আইবিআউটলেটগুলি আপনার দর্শন শ্রেণিবদ্ধের অংশ এবং এইভাবে স্পষ্টতই ধরে রাখা হয়েছে।
4 / ভিডিডিউনলোডে সমস্ত আইবিউটলেটগুলি ছেড়ে দিন
আপনার ডেলোক পদ্ধতি থেকে 5 / কল দেখুনডিডনলোড করুন। এটি স্পষ্টভাবে বলা হয় না।
স্মৃতি
1 / অটোরিলেজ অবজেক্ট আপনি যখন এগুলি তৈরি করেন। আপনার রিলিজ কলটিকে যদি অন্য কোনও শাখায় স্থানান্তরিত করে বা রিটার্নের বিবৃতি দেওয়ার পরে অনেকগুলি বাগ হয়। অটোরিলেজের পরিবর্তে রিলিজটি কেবলমাত্র ব্যতিক্রমী পরিস্থিতিতে ব্যবহার করা উচিত - যেমন আপনি যখন রান-লুপের জন্য অপেক্ষা করছেন এবং আপনি চান না যে আপনার অবজেক্টটি খুব শীঘ্রই স্বতঃস্ফুরিত হবে।
2 / এমনকি আপনি যদি লেখক সম্পর্কিত রেফারেন্স গণনা ব্যবহার করছেন তবে আপনাকে কীভাবে ধরে রাখা-মুক্তির পদ্ধতিগুলি কাজ করে তা পুরোপুরি বুঝতে হবে। ম্যানুয়ালি রিটেন-রিলিজ ব্যবহার করা এআরসি থেকে বেশি জটিল নয়, উভয় ক্ষেত্রেই আপনাকে ফাঁস এবং ধরে রাখা-চক্র সম্পর্কে জিনিস রাখতে হবে। বড় প্রকল্প বা জটিল অবজেক্ট শ্রেণিবিন্যাসে ম্যানুয়ালি ধরে রাখার-প্রকাশের কথা বিবেচনা করুন।
মন্তব্য
1 / আপনার কোডটি স্বয়ংক্রিয়ভাবে তৈরি করুন। প্রতিটি পরিবর্তনশীল নাম এবং পদ্ধতির নামটি এটি কী করছে তা জানানো উচিত। যদি কোডটি সঠিকভাবে লেখা থাকে (আপনার এতে প্রচুর অনুশীলনের প্রয়োজন হয়), আপনার কোনও কোড মন্তব্য (ডকুমেন্টেশন মন্তব্যগুলির মতো নয়) প্রয়োজন হবে না। অ্যালগরিদম জটিল হতে পারে তবে কোডটি সর্বদা সহজ হওয়া উচিত।
2 / কখনও কখনও, আপনার একটি মন্তব্য প্রয়োজন। সাধারণত কোনও আপাত কোড আচরণ বা হ্যাকের বর্ণনা দিতে হয়। যদি আপনার মনে হয় আপনাকে কোনও মন্তব্য লিখতে হবে তবে প্রথমে কোডটি সহজ এবং মন্তব্যের প্রয়োজন ছাড়াই নতুন করে লেখার চেষ্টা করুন।
খাঁজ
1 / ইনডেন্টেশন খুব বেশি বৃদ্ধি করবেন না। আপনার মেথড কোডের বেশিরভাগটি মেথড লেভেলে ইন্টেন্ট করা উচিত। নেস্টেড ব্লকস (যদি, ইত্যাদির জন্য) পাঠযোগ্যতা হ্রাস করে। আপনার যদি তিনটি নেস্টেড ব্লক থাকে তবে আপনার অভ্যন্তরীণ ব্লকগুলিকে আলাদা পদ্ধতিতে রাখার চেষ্টা করা উচিত। চার বা ততোধিক নেস্টেড ব্লক কখনও ব্যবহার করা উচিত নয়। যদি আপনার মেথড কোডের বেশিরভাগ যদি কোনও ইফের অভ্যন্তরে থাকে তবে যদি সেই শর্তটি উপেক্ষা করুন, উদাহরণস্বরূপ:
if (self) {
//... long initialization code ...
}
return self;
if (!self) {
return nil;
}
//... long initialization code ...
return self;
সি কোড, মূলত সি স্ট্রাক্ট বোঝে
নোট করুন যে ওবজ-সি সি ভাষার উপর কেবল হালকা ওওপি স্তর। আপনার সি বুঝতে হবে যে কীভাবে কোডের কাঠামোগত সি এন ওয়ার্কস (এনাম, স্ট্র্ট, অ্যারে, পয়েন্টার ইত্যাদি) কাজ করে। উদাহরণ:
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + 20);
হিসাবে একই:
CGRect frame = view.frame;
frame.size.height += 20;
view.frame = frame;
এবং আরো অনেক
আপনার নিজস্ব কোডিং স্ট্যান্ডার্ড ডকুমেন্টটি মেন্টেন করুন এবং প্রায়শই এটি আপডেট করুন। আপনার বাগগুলি থেকে শেখার চেষ্টা করুন। একটি ত্রুটি কেন তৈরি হয়েছিল তা বুঝুন এবং কোডিং মান ব্যবহার করে এড়াতে চেষ্টা করুন।
আমাদের কোডিং স্ট্যান্ডার্ডগুলিতে বর্তমানে প্রায় 20 পৃষ্ঠা, জাভা কোডিং স্ট্যান্ডার্ডস, গুগল ওবজে-সি / সি ++ স্ট্যান্ডার্ড এবং আমাদের নিজস্ব অ্যাডিং রয়েছে। আপনার কোডটি নথিভুক্ত করুন, স্ট্যান্ডার্ড স্ট্যান্ডার্ড ইনডেন্টেশন, সাদা স্থান এবং সঠিক জায়গাগুলিতে ফাঁকা লাইন ব্যবহার করুন use
আরও কার্যকর হতে হবে ।
অবজেক্টিভ-সি হ'ল অবজেক্ট-ওরিয়েন্টেড ভাষা, তবে কোকোয়া ফ্রেমওয়ার্ক কার্যকরী-শৈলী সচেতন, এবং এটি বেশ কয়েকটি ক্ষেত্রে কার্যকরী শৈলীর নকশা করা হয়েছে।
পরিবর্তনের বিচ্ছেদ রয়েছে। প্রাথমিক হিসাবে অপরিবর্তনীয় শ্রেণি এবং মাধ্যমিক হিসাবে পরিবর্তনীয় বস্তু ব্যবহার করুন । উদাহরণস্বরূপ, প্রাথমিকভাবে এনএসআরাই ব্যবহার করুন, এবং আপনার যখন প্রয়োজন হবে তখনই এনএসমিটেবলআরে ব্যবহার করুন।
খাঁটি ফাংশন আছে। এতগুলি নয়, অনেকগুলি ফ্রেমওয়ার্ক এপিআই কিনুন খাঁটি ফাংশনের মতো নকশাকৃত। যেমন ফাংশন তাকান CGRectMake()
বা CGAffineTransformMake()
। স্পষ্টতই পয়েন্টার ফর্মটি আরও দক্ষ দেখায়। তবে পয়েন্টারগুলির সাথে অপ্রত্যক্ষ যুক্তি পার্শ্ব-প্রতিক্রিয়া মুক্ত প্রস্তাব করতে পারে না। নিখুঁতভাবে যতটা সম্ভব কাঠামো ডিজাইন করুন। এমনকি রাষ্ট্রের বস্তু পৃথক করুন। অন্য বস্তুতে কোনও মান পাস করার -copy
পরিবর্তে ব্যবহার করুন -retain
। কারণ ভাগ করে নেওয়া স্থিতি নিঃশব্দে অন্য বস্তুর মানকে রূপান্তরকে প্রভাবিত করতে পারে। সুতরাং পার্শ্ব-প্রতিক্রিয়া-মুক্ত হতে পারে না। যদি আপনার অবজেক্ট থেকে বাইরের কোনও মান থাকে তবে এটি অনুলিপি করুন। সুতরাং এটি যতটা সম্ভব ন্যূনতম ভাগ করে নেওয়া রাষ্ট্রের নকশা করাও গুরুত্বপূর্ণ।
তবে খুব অশুচি ফাংশন ব্যবহার করে ভয় পাবেন না।
অলস মূল্যায়ন আছে। -[UIViewController view]
সম্পত্তির মতো কিছু দেখুন । বস্তুটি তৈরি হওয়ার সময় দৃশ্যটি তৈরি করা হবে না। কলার view
প্রথমবারের মতো সম্পত্তি পড়ার সময় এটি তৈরি করা হবে। UIImage
এটি আঁকানো না হওয়া পর্যন্ত লোড করা হবে না। এই নকশা মত অনেক বাস্তবায়ন আছে। এই ধরণের ডিজাইনগুলি রিসোর্স পরিচালনার জন্য খুব সহায়ক, তবে যদি আপনি অলস মূল্যায়নের ধারণাটি জানেন না, তবে তাদের আচরণ বোঝা সহজ নয়।
বন্ধ আছে। যথাসম্ভব সি-ব্লক ব্যবহার করুন। এটি আপনার জীবনকে ব্যাপকভাবে সরল করবে। তবে এটি ব্যবহারের আগে ব্লক-মেমরি-পরিচালনা সম্পর্কে আরও একবার পড়ুন।
সেমি-অটো জিসি আছে। NSAutoreleasePool। ব্যবহার করুন -autorelease
প্রাথমিক। -retain/-release
আপনার সত্যিকারের প্রয়োজন হলে ম্যানুয়াল মাধ্যমিকটি ব্যবহার করুন । (উদা: মেমরি অপ্টিমাইজেশন, সুস্পষ্ট সংস্থান মুছে ফেলা)
autorelease
সাধারণত মেমরি দীর্ঘকাল ধরে রাখবে, এবং ম্যানুয়াল retain/release
ক্ষেত্রে মেমরির খরচ কমাতে পারে। তবে এটি বিশেষ ক্ষেত্রে অপ্টিমাইজেশনের জন্য দিকনির্দেশনা হওয়া উচিত (এমনকি আপনি সর্বদা বোধ করছেন!), অনুশীলন হিসাবে অকাল অপ্টিমাইজেশানকে সাধারণ করার কারণ হতে পারে না । এবং আসলে, আপনার পরামর্শ আমার থেকে বিপরীত নয়। আমি এটি সত্যই প্রয়োজনের হিসাবে উল্লেখ করেছি :)