অবজেক্টিভ-সি এবং কোকো লেখার সময় আপনি কোন সেরা অনুশীলনগুলি ব্যবহার করেন? [বন্ধ]


346

আমি এইচআইজি সম্পর্কে জানি (যা বেশ কার্যকর)! তবে আপনি উদ্দেশ্যমূলক-সি লেখার সময় এবং বিশেষত কোকো (বা কোকো টোচ) ব্যবহার করার সময় কোন প্রোগ্রামিং অনুশীলনগুলি ব্যবহার করেন।


এই ব্লগ পোস্টটি দেখুন, খুব সুন্দর। আয়রনওলফ.ডেনারজগেমস
ব্লগ /

উত্তর:


398

আমি এমন কয়েকটি জিনিস শুরু করতে শুরু করেছি যা আমি মানসম্মত বলে মনে করি না:

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


3
ডাবল পাটিগণিত সম্পর্কে দুর্দান্ত টিপ অফ।
অ্যাডাম আর্নস্ট

8
ক্লাস এক্সটেনশনগুলি এখন ব্যক্তিগত পদ্ধতির পছন্দের উপায়: বিকাশকারী
অ্যাপ্লিকেশন

9
আইফোনের ডাবলস সম্পর্কে আপনার পরামর্শ তারিখ সীমার বাইরে stackoverflow.com/questions/1622729/...
Casebash

3
পুরানো নয়; সম্পূর্ণ ভুল: মূল আইফোনটি প্রায় একই গতিতে হার্ডওয়্যারে ভাসমান এবং ডাবলকে সমর্থন করে। এসকিউএলাইট লেনদেনকে মেমরিতে রাখে না; তারা ডিস্কে ভ্রমণ করা হয়। কেবল দীর্ঘ প্রশ্নগুলিই আপনার ইউআই অবরুদ্ধ করে; মূল থ্রেডে চালানো এবং দ্রুত অনুসন্ধানগুলি ব্যবহার করা কম অগোছালো।
টিসি।

1
@ টিসি: আমি লেনদেন সম্পর্কে এসকিউএল আইটেমটি সংশোধন করেছি, নোট করুন যে আমি নিজেও শেষ চারটি বা এই জাতীয় আইটেমটি লিখিনি। আমি ব্যাকগ্রাউন্ডে ক্যোয়ারীগুলি সরিয়ে নেওয়া সম্পর্কে অংশটি কেবল খুব দীর্ঘ প্রশ্নের জন্যই ছিল (কখনও কখনও আপনি কেবল তাদের ছোট করতে পারবেন না)। তবে কয়েকটি পয়েন্টের কারণে পুরো জিনিসটিকে "ভুল" বলা আমার পক্ষে বরং চরম অনুভূত। এছাড়াও, উপরের উত্তরটি ইতিমধ্যে জানিয়েছে: "পুরানো ফোনগুলিতে গণনাগুলি একই গতিতে পরিচালিত হয়" তবে একক নির্ভুলতার নিবন্ধগুলির বৃহত্তর সংখ্যা সম্পর্কে সে অংশটি নোট করুন যা সেগুলি আরও বেশি পছন্দসই করে তুলেছে।
কেন্ডাল হেলস্টেটার জেলনার

109

ফর্ম্যাট স্ট্রিং হিসাবে অজানা স্ট্রিং ব্যবহার করবেন না

যখন পদ্ধতি বা ফাংশন কোনও ফর্ম্যাট স্ট্রিং আর্গুমেন্ট গ্রহণ করে, আপনার ফর্ম্যাট স্ট্রিংয়ের বিষয়বস্তুর উপর নিয়ন্ত্রণ রয়েছে তা নিশ্চিত হওয়া উচিত।

উদাহরণস্বরূপ, স্ট্রিংগুলি লগ করার সময়, স্ট্রিং ভেরিয়েবলটিকে একমাত্র যুক্তি হিসাবে প্রেরণা দিতে প্ররোচিত করে NSLog:

    NSString *aString = // get a string from somewhere;
    NSLog(aString);

এটির সাথে সমস্যাটি হ'ল স্ট্রিংটিতে এমন অক্ষর থাকতে পারে যা ফর্ম্যাট স্ট্রিং হিসাবে ব্যাখ্যা করা হয়। এর ফলে ভ্রান্ত আউটপুট, ক্রাশ এবং সুরক্ষা সমস্যা দেখা দিতে পারে। পরিবর্তে, আপনার স্ট্রিং ভেরিয়েবলটি বিন্যাসের স্ট্রিংয়ের পরিবর্তে করা উচিত:

    NSLog(@"%@", aString);

4
আমাকে এর আগেও কামড়েছে।
অ্যাডাম আর্নস্ট

কোনও প্রোগ্রামিং ভাষার জন্য এটি ভাল পরামর্শ
টম ফোবিয়ার

107

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

কী করবেন এবং কী করবেন না তার উদাহরণ:

  • id m_something;কোনও অবজেক্টের ইন্টারফেসে ঘোষণা করবেন না এবং এটিকে সদস্য পরিবর্তনশীল বা ক্ষেত্র বলবেন না ; ব্যবহার করুন somethingবা _somethingএর নামের জন্য এবং এটিকে উদাহরণ পরিবর্তনশীল বলুন
  • গেটারের নাম রাখবেন না -getSomething; সঠিক কোকো নাম ঠিক -something
  • একটি সেটারের নাম রাখবেন না -something:; এটা করা উচিত-setSomething:
  • পদ্ধতির নামটি যুক্তিগুলির সাথে ছেদ করা হয় এবং এতে কলোন অন্তর্ভুক্ত থাকে; এটা -[NSObject performSelector:withObject:], না NSObject::performSelector
  • আন্ডারবার্স (আন্ডারস্কোর) না দিয়ে পদ্ধতির নাম, প্যারামিটার, ভেরিয়েবল, শ্রেণীর নাম ইত্যাদিতে ইন্টার-ক্যাপস (ক্যামেলকেস) ব্যবহার করুন।
  • শ্রেণীর নামগুলি বড় হাতের অক্ষরের সাথে পরিবর্তনশীল এবং নিম্ন-কেসের সাথে পদ্ধতির নাম দিয়ে শুরু হয়।

আপনি যা যা করেন না কেন, Win16 / Win32- স্টাইলের হাঙ্গেরিয়ান স্বরলিপি ব্যবহার করবেন না । এমনকি মাইক্রোসফ্ট .NET প্ল্যাটফর্মে চলে যাওয়ার সাথে সাথে এটি ছেড়ে দিয়েছে।


5
আমি তর্ক করব, সেটসামথিং: / কিছু না কিছু ব্যবহার করুন - পরিবর্তে বৈশিষ্ট্যগুলি ব্যবহার করুন। এই মুহুর্তে খুব কম লোকই আছেন
যাদের বাঘকে

18
বৈশিষ্ট্যগুলি এখনও আপনার জন্য অ্যাকসেসর পদ্ধতি উত্পন্ন করে এবং সম্পত্তিতে গেটর = / সেটার = বৈশিষ্ট্যগুলি আপনাকে পদ্ধতির নাম উল্লেখ করতে দেয়। এছাড়াও, আপনি বৈশিষ্ট্যগুলির সাথে foo.something সিনট্যাক্সের পরিবর্তে [foo something] সিনট্যাক্স ব্যবহার করতে পারেন। সুতরাং অ্যাক্সেসর নামকরণ এখনও প্রাসঙ্গিক।
ক্রিস হ্যানসন

3
এটি সি ++ থেকে আগত কারও পক্ষে একটি দুর্দান্ত রেফারেন্স, যেখানে আমি আপনার বিরুদ্ধে পরামর্শ দেওয়া বেশিরভাগ জিনিসই করেছি।
ক্লিনটন ব্ল্যাকমোর

4
একটি সেটারের ফলে ডেটাবেসে কিছু সংরক্ষণের কারণ ঘটানো উচিত নয়। কোর ডেটাগুলির একটি-সেভ করার একটি কারণ রয়েছে: এনএসম্যানেজডঅবজেক্ট কনটেক্সটে পদ্ধতিটি, সেটটাররা তাত্ক্ষণিক আপডেট উত্পন্ন করার পরিবর্তে।
ক্রিস হ্যানসন

2
আমি সন্দেহ করি যে এটি কোনও বিকল্প ছিল না, তবে এটির জন্য আপনার অ্যাপের স্থাপত্যটির পুনর্বিবেচনার প্রয়োজন হতে পারে। (পরিষ্কার করার জন্য: আমি বলছি না "আপনার কোর ডেটা ব্যবহার করা উচিত ছিল।" আমি বলছি "সেটারদের ডাটাবেসে সংরক্ষণ করা উচিত নয়।") কোনও বস্তু গ্রাফের মধ্যে পৃথক বস্তু সংরক্ষণের পরিবর্তে কোনও বিষয় গ্রাফ পরিচালনা করার প্রসঙ্গে , কার্যত সর্বদা সম্ভব এবং একটি ভাল সমাধান উভয়ই।
ক্রিস হ্যানসন

106

IBOutlets

.তিহাসিকভাবে, আউটলেটগুলির মেমরি পরিচালনা খুব খারাপ। বর্তমান সেরা অনুশীলন হ'ল আউটলেটগুলি সম্পত্তি হিসাবে ঘোষণা করা:

@interface MyClass :NSObject {
    NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end

বৈশিষ্ট্য ব্যবহার করে মেমরি পরিচালন শব্দার্থকে পরিষ্কার করে তোলে; যদি আপনি উদাহরণ পরিবর্তনশীল সংশ্লেষণ ব্যবহার করেন তবে এটি একটি সামঞ্জস্যপূর্ণ প্যাটার্নও সরবরাহ করে।


1
নিব লোড করা কি আবার দু'বার ধরে রাখবে না? (একবার নিব মধ্যে, সম্পত্তি বরাদ্দ দ্বারা দ্বিতীয়)। আমার কি ডেলোকের লোকদের ছেড়ে দেওয়ার কথা?
কর্নেল

6
ফাঁস এড়াতে আপনাকে ভিউডিডনলোড (আইফোন ওএস 3.0++) বা একটি কাস্টম সেটভিউ: পদ্ধতিতে আউটলেটগুলি কমাতে হবে। স্পষ্টতই আপনার পাশাপাশি dealloc এ মুক্তি দেওয়া উচিত।
ফ্র্যাঙ্ক এস্কজারবা

2
মনে রাখবেন যে সবাই এই স্টাইলের সাথে একমত নন
মাইকেল

অ্যাপলও এইভাবে কাজ করে। "আইফোন 3 বিকাশ শুরু" পূর্ববর্তী সংস্করণগুলি থেকেও এই পরিবর্তনটির উল্লেখ করে।
অস্টুন

আমি এটি অন্য মন্তব্যে উল্লেখ করেছি, তবে এটি এখানে রাখা উচিত ছিল: একবার আইওএস অ্যাপ্লিকেশনগুলির জন্য গতিশীল ivar সংশ্লেষণ ঘটতে শুরু করে (যদি / কখন?), আপনি আইভাউলেটটিকে বনাম আইভারে রাখলে আপনি খুশি হবেন!
জো

97

এলএলভিএম / কলং স্ট্যাটিক বিশ্লেষক ব্যবহার করুন

দ্রষ্টব্য: এক্সকোড 4 এর অধীনে এটি এখন আইডিইতে অন্তর্নির্মিত।

আপনি অনাকাঙ্ক্ষিতভাবে - ম্যাক ওএস এক্স 10.5 তে আপনার সি এবং অবজেক্টিভ-সি কোড (এখনও কোনও সি ++ নেই) বিশ্লেষণ করতে ক্ল্যাং স্ট্যাটিক বিশ্লেষক ব্যবহার করেন । এটি ইনস্টল এবং ব্যবহার করা তুচ্ছ:

  1. এই পৃষ্ঠাটি থেকে সর্বশেষতম সংস্করণটি ডাউনলোড করুন ।
  2. কমান্ড-লাইন cdথেকে আপনার প্রকল্প ডিরেক্টরিতে।
  3. সম্পাদন scan-build -k -V xcodebuild

(কিছু অতিরিক্ত প্রতিবন্ধকতা ইত্যাদি রয়েছে, বিশেষত আপনার "ডিবাগ" কনফিগারেশনে আপনার কোনও প্রকল্প বিশ্লেষণ করা উচিত - বিশদের জন্য http://clang.llvm.org/StaticAnalysisUsage.html দেখুন - তবে এটি কম-বেশি বা কম এটি কীভাবে ফুটে যায়।)

এরপরে বিশ্লেষক আপনার জন্য ওয়েব পৃষ্ঠাগুলির একটি সেট তৈরি করে যা সম্ভবত মেমরি পরিচালনা এবং অন্যান্য প্রাথমিক সমস্যাগুলি দেখায় যা সংকলক সনাক্ত করতে অক্ষম।


1
আমি এই নির্দেশাবলী অনুসরণ না করা পর্যন্ত এটি কাজ করতে আমাকে কিছুটা সমস্যা হয়েছিল: oiledmachine.com/posts/2009/01/06/…
জন্ম

15
স্নো চিতাবাঘের এক্সকোড ৩.২.১ এ এটি ইতিমধ্যে নির্মিত হয়েছে Run আপনি রান -> বিল্ড এবং বিশ্লেষণ ব্যবহার করে এটি ম্যানুয়ালি চালাতে পারেন বা আপনি "রান স্ট্যাটিক অ্যানালাইজার" বিল্ড সেটিংসের মাধ্যমে এটি সমস্ত বিল্ডের জন্য সক্ষম করতে পারবেন। মনে রাখবেন যে এই সরঞ্জামটি বর্তমানে কেবল সি এবং উদ্দেশ্যমূলক-সি সমর্থন করে তবে সি ++ / অবজেক্টিভ-সি ++ নয়।
oefe

94

এটি সূক্ষ্ম এক কিন্তু কার্যকর এক। যদি আপনি নিজেকে অন্য কোনও জিনিসের প্রতিনিধি হিসাবে পাস করেন তবে সেই বস্তুর প্রতিনিধিটিকে আপনার আগে পুনরায় সেট করুন 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;

8
এটি সম্পর্কে সূক্ষ্ম কিছুই নেই, ডকুমেন্টেশন পরিষ্কারভাবে বলেছে যে এটি করা আপনার প্রয়োজন। থেকে 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.
জন

NULL এর পরিবর্তে নীল ব্যবহার করা ভাল, কারণ NULL মেমরিটি মুক্ত করবে না।
নবীন শান

@NaveenShan nil == NULL। এগুলি nilহ'ল এগুলি হ'ল এক idএবং NULLvoid *। আপনার বক্তব্য সত্য নয়।

@ ডব্লিউটিপি হ্যাঁ, শূন্য == নুল, তবে আপনি যদি আপেলের উদাহরণ কোড টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে দেখে থাকেন, এবং আপনি যেমন বলেছিলেন, শূন্য একটি আইডি, যা এটি শূন্যতার চেয়ে পছন্দসই করে তোলে * , আপনি যেখানে আইডি প্রেরণ করেন সে ক্ষেত্রে।
আহতি

1
@ অট্টি হুবহু, এবং Nil(বড় হাতের) প্রকারের Class*। যদিও তারা সকলেই সমান, ভুলটি ব্যবহার করে বিশেষত উদ্দেশ্য-সি ++ এ দুষ্টু ছোট্ট বাগগুলি প্রবর্তন করতে পারে।

86

@kendell

পরিবর্তে:

@interface MyClass (private)
- (void) someMethod
- (void) someOtherMethod
@end

ব্যবহার করুন:

@interface MyClass ()
- (void) someMethod
- (void) someOtherMethod
@end

উদ্দেশ্য-সি 2.0 তে নতুন।

ক্লাস এক্সটেনশানগুলি অ্যাপলের উদ্দেশ্য-সি 2.0 রেফারেন্সে বর্ণিত হয়েছে described

"ক্লাস এক্সটেনশানগুলি আপনাকে প্রাথমিক শ্রেণীর @ অভ্যন্তরীণ ব্লকের বাইরে অন্য জায়গাগুলিতে কোনও শ্রেণীর জন্য অতিরিক্ত প্রয়োজনীয় এপিআই ঘোষণা করার অনুমতি দেয়"

সুতরাং তারা প্রকৃত শ্রেণির অংশ - এবং ক্লাস ছাড়াও একটি (প্রাইভেট) বিভাগ নয়। সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য।


আপনি এটি করতে পারেন তবে আমি এটি স্পষ্টভাবে একটি "বেসরকারী" বিভাগ হিসাবে চিহ্নিত করতে চাই (কার্যকরী তুলনায় আরও ডকুমেন্টেশন) যদিও এটি
এম। এম

2
ছাড়া সেখানে হয় ব্যক্তিগত বিভাগ এবং ক্লাস এক্সটেনশন মধ্যে একটি পার্থক্য: সম্পাদনা লিঙ্কটি দেখুন: "ক্লাস এক্সটেনশানগুলি আপনাকে, প্রাথমিক শ্রেণী @interface ব্লকের মধ্যে ছাড়া অন্য স্থানে একটি বর্গ জন্য অতিরিক্ত প্রয়োজনীয় এপিআই ডিক্লেয়ার করে যা নিম্নলিখিত উদাহরণে সচিত্র অনুমতি দিন"।
schwa

আমি সম্মতি দিচ্ছি যে পার্থক্য রয়েছে যেখানে সংকলক আপনাকে সতর্ক করবে যখন আপনি সিই পদ্ধতি প্রয়োগ করেননি - তবে সমস্ত পদ্ধতি একই ফাইলে থাকা এবং সমস্ত ব্যক্তিগত থাকার ক্ষেত্রে আমি সেই দিকটি খুব গুরুত্বপূর্ণ মনে করি না। আমি এখনও ফরওয়ার্ড রেফারেন্স ব্লকটি ব্যক্তিগত হিসাবে চিহ্নিত করার রক্ষণাবেক্ষণের দিকটি পছন্দ করি
কেন্ডাল হেলস্টেটার জেলনার

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

17
(বা অন্য কোনও বিভাগের নাম) এর ()পরিবর্তে ব্যবহার করার পরিবর্তে একটি গুরুত্বপূর্ণ সুবিধা রয়েছে (Private): আপনি কেবলমাত্র পঠনযোগ্য জনসাধারণের কাছে পাঠ্য রচনা হিসাবে বৈশিষ্ট্যগুলি পুনরায় বিবরণ করতে পারেন। :)
পাস্কাল

75

অটোরিলেজ এড়িয়ে চলুন

যেহেতু সাধারণত (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) আপনি নিজের স্থানীয় অটোরিলেস পুল ব্যবহার করে নিয়ন্ত্রণ নিতে পারেন। এ সম্পর্কে আরও তথ্যের জন্য অটোরিলেজ পুলগুলি দেখুন


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

56
আমি একমত নই যখনই সম্ভব আপনার স্বাবলম্বী বস্তু ব্যবহার করা উচিত। এগুলি যদি মেমরির পদচিহ্নগুলি খুব বেশি বাড়িয়ে দেয় তবে আপনার আর একটি ব্যবহার করা উচিত NSAutoreleasePool। তবে কেবলমাত্র আপনি নিশ্চিত করেছেন যে এটি আসলেই একটি সমস্যা। অকাল অপ্টিমাইজেশান এবং সব যে ...
সেভেন

3
আমি 40 সেকেন্ডের চেয়ে কম সময় ব্যয় করি। একটি নতুন টাইপ ইনস্ট্যান্ট করার সময় একটি দিন টাইপিং [কোনও অবজেক্ট রিলিজ] এবং "অতিরিক্ত লাইন" পড়ার পরে, তবে আমি একটি অটোরলেজ বাগটি খুঁজে পেতে 17 ঘন্টার মধ্যে একবার পোড়েছিলাম যা কেবলমাত্র বিশেষ ক্ষেত্রে প্রদর্শিত হবে এবং কনসোলে কোনও সুসংগত ত্রুটি দেয় নি। সুতরাং আমি যখন আদিবের সাথে একমত হই তখন তিনি "অটোরিলেজ ব্যবহার না করার সুবিধাগুলি খুঁজে পান এর ব্যয়কে ছাড়িয়ে যায়"।
রিকিজি

7
আমি সোভেনের সাথে একমত প্রাথমিক লক্ষ্যটি কোডের স্বচ্ছতা এবং কোডিং ত্রুটিগুলি হ্রাস করা উচিত, কেবল যেখানে প্রয়োজন সেখানে মেমরি অপ্টিমাইজেশন সহ। একটি [[[Foo বরাদ্দ] init] স্বতঃপরিচয়] টাইপ করা দ্রুত এবং আপনি এই নতুন অবজেক্টটি অবমুক্ত করার বিষয়টি অবিলম্বে মোকাবেলা করেন। কোডটি পড়ার সময় আপনাকে সংশ্লিষ্ট রিলিজটি ফাঁস হচ্ছে না তা নিশ্চিত করার জন্য খোঁজ করতে হবে না।
মাইক ওয়েলার

3
স্বতঃস্ফুর্ত বস্তুর জীবনচক্রটি যথেষ্ট পর্যায়ে ভালভাবে সংজ্ঞায়িত এবং নির্ধারণযোগ্য।
ইওনিল

69

এর মধ্যে কয়েকটি ইতিমধ্যে উল্লেখ করা হয়েছে, তবে আমি এখানে আমার মাথার উপরের অংশটি সম্পর্কে কী ভাবতে পারি:

  • কেভিও নামকরণের নিয়ম অনুসরণ করুন। এমনকি যদি আপনি এখন কেভিও ব্যবহার না করেন তবে আমার অভিজ্ঞতাতে প্রায়শই এটি ভবিষ্যতে এখনও উপকারী। এবং যদি আপনি কেভিও বা বাইন্ডিং ব্যবহার করে থাকেন তবে আপনার জানা দরকার যে জিনিসগুলি যেভাবে অনুমান করা হচ্ছে সেভাবে কাজ করছে। এটিতে কেবল অ্যাকসেসর পদ্ধতি এবং উদাহরণের ভেরিয়েবলগুলিই নয়, তবে অনেকগুলি সম্পর্ক, বৈধতা, নির্ভরযোগ্য কীগুলি স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তি দেওয়া ইত্যাদি।
  • ব্যক্তিগত পদ্ধতিগুলিকে একটি বিভাগে রাখুন। শুধু ইন্টারফেস নয়, বাস্তবায়নও। বেসরকারী এবং বেসরকারী পদ্ধতির মধ্যে ধারণাগতভাবে কিছু দূরত্ব থাকা ভাল। আমি আমার। মি ফাইলটিতে সমস্ত কিছু অন্তর্ভুক্ত করেছি।
  • একটি বিভাগে পটভূমি থ্রেড পদ্ধতি রাখুন। উপরের মতই. মূল থ্রেডটি কী এবং কোনটি নয় তা নিয়ে আপনি যখন ভাবছেন তখন একটি পরিষ্কার ধারণাগত বাধা রাখা ভাল।
  • ব্যবহার #pragma mark [section]সাধারণত আমি আমার নিজস্ব পদ্ধতি, প্রতিটি সাবক্লাসের ওভাররাইড এবং কোনও তথ্য বা আনুষ্ঠানিক প্রোটোকল দ্বারা গ্রুপ করি। এটি আমি যা খুঁজছি ঠিক তার দিকে ঝাঁপিয়ে পড়া অনেক সহজ করে তোলে। একই বিষয়ে, একই রকমের গ্রুপগুলি (টেবিল ভিউয়ের প্রতিনিধি পদ্ধতিগুলির মতো) একসাথে গোষ্ঠীভুক্ত করুন, কেবল এটিকে কোথাও আটকে রাখবেন না।
  • প্রিফিক্স ব্যক্তিগত পদ্ধতি এবং _ সহ আইভর। আমি দেখতে দেখতে এটির মতো পছন্দ করি এবং দুর্ঘটনার কারণে আমি যখন কোনও সম্পত্তি বোঝায় তখন আমি আইভার ব্যবহার করার সম্ভাবনা কম করি।
  • আর ডিএলক-তে পরিবর্তক পদ্ধতি / বৈশিষ্ট্য ব্যবহার করবেন না। এর কারণে আমার কখনও খারাপ কিছু ঘটেনি, তবে আপনি যুক্তিটি দেখতে পাচ্ছেন যদি আপনি এমন কিছু করার পদ্ধতি পরিবর্তন করেন যা আপনার অবজেক্টের অবস্থার উপর নির্ভর করে।
  • বৈশিষ্ট্যগুলিতে আইবিআউটলেটগুলি রাখুন। আমি আসলে এখানে এটি পড়ি, তবে আমি এটি করা শুরু করব। যেকোন স্মৃতির সুবিধা নির্বিশেষে, এটি স্টাইলিস্টিকভাবে ভাল বলে মনে হচ্ছে (কমপক্ষে আমার কাছে)।
  • আপনার একেবারেই প্রয়োজন নেই কোড লেখা এড়িয়ে চলুন। এটি সত্যিই প্রচুর পরিমাণে coversেকে রাখে, যেমন একটি #defineউইল তৈরির সময় আইভারা তৈরি করা বা ডাটা ব্যবহারের সময় প্রতিটি বার এটি বাছাইয়ের পরিবর্তে একটি অ্যারে ক্যাশে করা। আমি এটি সম্পর্কে অনেক কিছুই বলতে পারি, তবে নীচের লাইনে আপনার প্রয়োজন না হওয়া পর্যন্ত কোড লেখা হয় না বা প্রোফাইলার আপনাকে বলে। এটি দীর্ঘমেয়াদে বজায় রাখা জিনিসগুলিকে অনেক সহজ করে তোলে।
  • আপনি যা শুরু করেন তা শেষ করুন। প্রচুর অর্ধ-সমাপ্ত হওয়া, বগি কোডটি কোনও প্রকল্প মৃতের দ্রুততম উপায়। আপনার যদি এমন স্টাবের পদ্ধতিটি ভাল হয় যা ভাল হয় NSLog( @"stub" )তবে এটি কেবল ভিতরে রেখেই এটি নির্দেশ করুন বা আপনি কোনও জিনিস রাখতে চান।

3
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার ক্লাসের ধারাবাহিকতায় ব্যক্তিগত পদ্ধতি রাখা উচিত। (যেমন @ আন্তঃআরফেস মাইক্লাস () ... @ আপনার। মি তে)
জেসন

3
# PRAGMA এর পরিবর্তে আপনি একটি মন্তব্য ব্যবহার করতে পারেন // চিহ্নিত করুন: [বিভাগ] যা আরও বহনযোগ্য এবং একইভাবে কাজ করে।
আলেম্ব

আমি অনুপস্থিত একটি বিশেষ সিনট্যাক্স না থাকলে, // চিহ্নিত করুন: এক্সকোডের ফাংশনগুলি ড্রপ ডাউন মেনুতে কোনও লেবেল যুক্ত করে না, যা এটি ব্যবহারের সত্যিকার অর্ধেক কারণ।
মার্ক চর্বোনিউ

6
ড্রপ ডাউনটিতে এটি প্রদর্শিত করতে আপনাকে বড় হাতের অক্ষর, "// মার্ক: ..." ব্যবহার করতে হবে।
রাউলেট

3
শ্রদ্ধার সাথে Finish what you startআপনি সম্পূর্ণ // TODO:করার জন্য কোড চিহ্নিত করতেও ব্যবহার করতে পারেন যা ড্রপ ডাউনতে প্রদর্শিত হবে।
iwasrobbed

56

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

আপনার নিজের অভ্যন্তরগুলির জন্য পরীক্ষার লেখার পথে পাবলিক বনাম সুরক্ষিত বনাম ব্যক্তিগত পদ্ধতির দৃশ্যমানতাও নেই don't


আপনি কোন পরীক্ষার ফ্রেমওয়ার্কগুলি প্রস্তাব করেন?
melpar

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

55

সুবর্ণ নিয়ম: আপনি যদি allocতাই হয় release!

আপডেট: আপনি যদি আরসি ব্যবহার না করেন তবে


26
এছাড়াও আপনি যদি copy, mutableCopy, newবা retain
সেভেন

54

উদ্দেশ্য-সি লিখবেন না যেন এটি জাভা / সি # / সি ++ / ইত্যাদি +

আমি একবার দেখেছি যে একটি দল জাভা EE ওয়েব অ্যাপ্লিকেশনগুলি লেখার জন্য ব্যবহৃত হয়েছিল, তারা কোকো ডেস্কটপ অ্যাপ্লিকেশন লেখার চেষ্টা করছে। যেন এটি জাভা ইই ওয়েব অ্যাপ্লিকেশন। সেখানে অনেকগুলি অ্যাবস্ট্রাকফুফ্যাক্টরি এবং ফুফ্যাক্টরী এবং আইফু এবং ফু ছিল যখন তাদের সত্যিই দরকার ছিল কেবল একটি ফু ক্লাস এবং সম্ভবত একটি ফুয়েবল প্রোটোকল।

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


10
জাভা ডেভেলপার হিসাবে যিনি উদ্দেশ্য-সি-তে একটি বিমূর্ত কারখানা লিখেছেন আমি এই আকর্ষণীয় দেখতে পাই find এটি কীভাবে কাজ করে - সম্ভবত একটি উদাহরণ দিয়ে আরও কিছুটা ব্যাখ্যা করতে আপনার মনে হবে?
তেবট

2
আপনি কি এখনও বিশ্বাস করেন যে আপনি এই উত্তরটি পোস্ট করার পরে অতীত সময়ের পরেও আমাদের বিমূর্ত কারখানার ক্লাসের প্রয়োজন নেই?
kirk.burleson

50

নিশ্চিত করুন যে আপনি ডিবাগিং ম্যাজিক পৃষ্ঠাটি বুকমার্ক করেছেন । কোকো বাগের উত্স খোঁজার চেষ্টা করার সময় কোনও প্রাচীরের বিরুদ্ধে মাথা ঘোরানোর সময় এটি আপনার প্রথম স্টপ হওয়া উচিত।

উদাহরণস্বরূপ, এটি আপনাকে সেই পদ্ধতিটি কীভাবে খুঁজে পাবে যেখানে আপনি প্রথমে মেমরি বরাদ্দ করেছিলেন যা পরবর্তীতে ক্রাশ ঘটছে (অ্যাপ্লিকেশন সমাপ্তির সময়)।


1
ডিবাগিং ম্যাজিক পৃষ্ঠার একটি আইওএস নির্দিষ্ট সংস্করণ রয়েছে ।
জেঠু

38

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

এটি করবেন না।

আপনার কোডটি দুই ডজন ফাউন্ডেশন ক্লাসের শীর্ষে ছড়িয়ে ছিটিয়ে থাকা কয়েক ডজন ছোট বিভাগের পদ্ধতি দিয়ে বোঝা আরও পোর্টেবল এবং সহজ হবে।

বেশিরভাগ সময় যখন আপনি সত্যিই ভাবেন যে কিছু কোড প্রবাহিত করতে আপনার কোনও বিভাগের পদ্ধতি প্রয়োজন তখন আপনি দেখতে পাবেন যে আপনি কখনই পদ্ধতিটি পুনরায় ব্যবহার করবেন না।

অন্যান্য বিপদগুলিও রয়েছে, যদি না আপনি নিজের বিভাগের পদ্ধতিগুলির নাম উল্লেখ করেন (এবং সম্পূর্ণ উন্মাদ ডিড্রবিন ছাড়া কে হবেন?) অ্যাপল, বা প্লাগইন, বা আপনার ঠিকানার জায়গাতে চলমান অন্য কোনও কিছুও একই বিভাগটি সংজ্ঞায়িত করবে unless কিছুটা ভিন্ন পার্শ্ব প্রতিক্রিয়া সহ একই নামের পদ্ধতি ...

ঠিক আছে. এখন আপনাকে সতর্ক করা হয়েছে, "এই অংশটি করবেন না" উপেক্ষা করুন। তবে চরম সংযম অনুশীলন করুন।


আমি আপনার উত্তরটি পছন্দ করি, আমার পরামর্শটি ইউটিলিটি কোড সংরক্ষণ করার জন্য কোনও বিভাগটি ব্যবহার করবে না যদি আপনি একাধিক স্থানে কিছু কোডের প্রতিলিপি তৈরি করতে না যান এবং কোডটি আপনি যে শ্রেণীর শ্রেণীর করে চলেছেন তার ক্লাসটি স্পষ্টভাবে সম্পর্কিত ...
কেন্ডাল হেলস্টেটার জেলনার 6

আমি কেবল পাইপটি করতে চাই এবং নেমস্পেসিং বিভাগের পদ্ধতিগুলির জন্য আমার সমর্থনটি ভয়েস করতে চাই। এটি ঠিক মতো করার মতো মনে হচ্ছে।
মাইকেল বাকলি

+1 যদি কেবল রোমান সংখ্যার জন্য হয়। আমি পুরোপুরি এটি করতাম!
ব্রায়ান পোস্টো

14
কাউন্টার-পয়েন্ট: গত দেড় বছর ধরে আমি সঠিক বিপরীত নীতি অনুসরণ করেছি: "যদি এটি কোনও বিভাগে প্রয়োগ করা যায়, তবে এটি করুন" " ফলস্বরূপ, অ্যাপল যে ভার্বোস নমুনা কোড সরবরাহ করে তার চেয়ে আমার কোডটি আরও সংক্ষিপ্ত, আরও অভিব্যক্তিপূর্ণ এবং পড়া সহজ। একটি নাম স্থানের দ্বন্দ্বের জন্য আমি প্রায় 10 মিনিট হারিয়েছি এবং আমি নিজের জন্য যে দক্ষতা তৈরি করেছি তার থেকে সম্ভবত আমি মানব-মাস অর্জন করেছি। তাদের প্রত্যেকের কাছে, তবে আমি ঝুঁকিগুলি জেনে এই নীতি গ্রহণ করেছি এবং আমি পেরে অত্যন্ত আনন্দিত।
সিডিউইউএন

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

37

বিশ্বকে সাবক্লাসিংয়ের বিরুদ্ধে প্রতিরোধ করুন। কোকোতে প্রতিনিধি এবং অন্তর্নিহিত রানটাইম ব্যবহারের মাধ্যমে অনেক কিছু করা হয় যা অন্যান্য ফ্রেমওয়ার্কগুলিতে সাবক্লাসিংয়ের মাধ্যমে করা হয়।

উদাহরণস্বরূপ, জাভাতে আপনি বেনামে *Listenerসাবক্লাসগুলির উদাহরণগুলি প্রচুর ব্যবহার করেন এবং .NET এ আপনি আপনার EventArgsসাবক্লাসগুলি প্রচুর ব্যবহার করেন । কোকোতে, আপনিও করবেন না - পরিবর্তে লক্ষ্য-ক্রিয়া ব্যবহৃত হয়।


6
অন্যথায় "কম্প্রেশন ওভার ইনরিয়েন্স" হিসাবে পরিচিত।
অ্যান্ড্রু এবলিং

37

ব্যবহারকারী হিসাবে স্ট্রিং বাছাই করুন

যখন আপনি ব্যবহারকারীর কাছে উপস্থাপনের জন্য স্ট্রিংগুলি সাজান, আপনার সহজ compare:পদ্ধতিটি ব্যবহার করা উচিত নয় । পরিবর্তে, আপনার সর্বদা স্থানীয় তুলনা পদ্ধতি যেমন localizedCompare:বা হিসাবে ব্যবহার করা উচিত localizedCaseInsensitiveCompare:

আরও বিশদের জন্য অনুসন্ধানগুলি, তুলনা এবং স্ট্রিংগুলি বাছাই করুন


31

ঘোষিত সম্পত্তি

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

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


26

শূন্য মান সম্পর্কে চিন্তা করুন

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


আমি এই আছে: #define SXRelease(o); o = nilএবং জন্য একই CFReleaseএবং free। এটি সবকিছুকে সহজতর করে।

26

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



23

সাধারণ কিন্তু একটানা ভুলে যাওয়া এক। অনুমান অনুসারে:

সাধারণভাবে, বিভিন্ন শ্রেণীর যে পদ্ধতিগুলিতে একই নির্বাচক (একই নাম) থাকে তাদের একই রিটার্ন এবং যুক্তির ধরণগুলিও ভাগ করতে হবে। এই সীমাবদ্ধতা গতিশীল বাঁধাই অনুমতি সংকলক দ্বারা আরোপিত হয়।

এক্ষেত্রে একই নামযুক্ত সমস্ত নির্বাচক, এমনকি বিভিন্ন শ্রেণিতে হলেও , একই রকম রিটার্ন / আর্গুমেন্টের ধরণ হিসাবে বিবেচিত হবে। এখানে একটি সহজ উদাহরণ।

@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;
}   

এটি ভুলে যাওয়া সহজ তবুও গুরুত্বপূর্ণ
ব্রুক উলফ

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

আমরা যদি অ্যাপলের নামকরণের কনভেনশন গাইডলাইনটি অনুসরণ করি তবে এই পরিস্থিতিটি ঘটবে না :)
ইওনিল

22

আপনি যদি চিতাবাঘ (ম্যাক ওএস এক্স 10.5) বা তার পরে ব্যবহার করে থাকেন তবে মেমরি ফাঁসগুলি সন্ধান করতে এবং ট্র্যাক করতে আপনি ইনস্ট্রুমেন্টস অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন। এক্সকোডে আপনার প্রোগ্রামটি তৈরি করার পরে, রান> পারফরম্যান্স সরঞ্জাম দিয়ে শুরু করুন> লিক নির্বাচন করুন।

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

এখন যখনই আপনি আপনার অ্যাপ্লিকেশন রেকর্ডিং বন্ধ করবেন, অবজেক্টএলোক সরঞ্জামটি নির্বাচন করা আপনাকে "# নেট" কলামে আপনার অ্যাপ্লিকেশনের প্রতিটি স্থির-জীবিত অবজেক্টের জন্য কতগুলি রেফারেন্স রয়েছে তা দেখায়। নিশ্চিত করুন যে আপনি কেবল নিজের ক্লাসগুলিতেই নয়, আপনার এনআইবি ফাইলগুলির শীর্ষ-স্তরের অবজেক্টের ক্লাসগুলিও দেখেছেন Make উদাহরণস্বরূপ, যদি স্ক্রিনে আপনার কোনও উইন্ডো না থাকে এবং আপনি স্থায়ী এনএসউইন্ডোর উল্লেখ দেখতে পান তবে আপনি এটি আপনার কোডে প্রকাশ করেন নি।


21

Dealloc এ পরিষ্কার করুন।

এটি ভুলে যাওয়া সহজ জিনিসগুলির মধ্যে একটি - এসএসপি। 150mph এ কোডিং করার সময়। সর্বদা, সর্বদা, সর্বদা আপনার গুণাবলী / সদস্য ভেরিয়েবলগুলি ডেললকে পরিষ্কার করুন।

আমি নতুন ডট স্বরলিপি সহ - ওবিজেসি 2 বৈশিষ্ট্যগুলি ব্যবহার করতে চাই - সুতরাং এটি ক্লিনআপটিকে ব্যথাহীন করে তোলে। প্রায়শই সহজ:

- (void)dealloc
{
    self.someAttribute = NULL;
    [super dealloc];
}

(- আরও dealloc নিচে ক্ষেত্রে অন্য পদ্ধতি সদস্য পরিবর্তনশীল আবার ব্যবহারের - যা আমি আত্মরক্ষামূলক প্রোগ্রামিং বিবেচনা দুর্লভ কিন্তু এটি আপনার জন্য মুক্তির যত্ন নিতে হবে এবং শূন্য থেকে অ্যাট্রিবিউট সেট পারে ঘটতে)।

জিসি 10.5-এ চালু হওয়ার সাথে এর আর বেশি প্রয়োজন নেই - তবে আপনার নিজের তৈরি অন্যান্য সংস্থানগুলি পরিষ্কার করার দরকার হতে পারে, পরিবর্তে চূড়ান্তকরণ পদ্ধতিতে আপনি এটি করতে পারেন।


12
সাধারণভাবে আপনাকে ডেলোক (বা init) এ অ্যাকসেসর পদ্ধতি ব্যবহার করা উচিত নয়
এমএমএলসি

1
পারফরম্যান্স কারণে (অ্যাক্সেসরগুলি সরাসরি অ্যাক্সেসের তুলনায় কিছুটা ধীরে ধীরে) কেন আমি ডেললক বা ইনসে অ্যাক্সেসরগুলি ব্যবহার করব না?
schwa

1
(ক) পারফরম্যান্সের কারণগুলি নিজেদের মধ্যে পুরোপুরি যথেষ্ট কারণ (বিশেষত যদি আপনার অ্যাক্সেসরগুলি পারমাণবিক হয়)। (খ) অ্যাকসেসরগুলির যে কোনও পার্শ্ব প্রতিক্রিয়া আপনার এড়ানো উচিত। পরেরটি বিশেষত একটি সমস্যা হ'ল যদি আপনার ক্লাসটি সাবক্ল্যাস করা থাকে।
ম্যামালক

3
আমি লক্ষ করব যে আপনি যদি আধুনিক রানটাইমটিতে সংশ্লেষিত আইভরগুলি নিয়ে চলছেন তবে আপনাকে অবশ্যই ডেলোকের মধ্যে অ্যাকসেসর ব্যবহার করতে হবে । প্রচুর আধুনিক রানটাইম কোডটি হ'ল জিসি, তবে এটি সমস্ত নয়।
লুই গারবার্গ

1
অ্যাসেসর পদ্ধতি / বৈশিষ্ট্য -initএবং -deallocপদ্ধতিগুলিতে ব্যবহারের জন্য ওয়েথারের
জোহান কুল

17

এই সমস্ত মন্তব্য দুর্দান্ত, কিন্তু আমি সত্যিই অবাক হয়েছি কেউ গুগলের উদ্দেশ্য-সি স্টাইল গাইড উল্লেখ করেনি যা কিছুক্ষণ আগে প্রকাশিত হয়েছিল। আমি মনে করি তারা খুব নিখুঁত কাজ করেছে job


7
হুঁ, প্রথম উদাহরণটি ইতিমধ্যে বুলশিটে পূর্ণ। ভাষার আইডিয়ামগুলি কখনই নথিভুক্ত করবেন না। আমি যদি একটি শিরোনাম ফাইলটিতে এই ধরণের মন্তব্যগুলি খুঁজে পাই তবে আমি পড়তে বিরক্ত করব না।
স্টিফান এগারমন্ট

5
ওরে আমার চোখ !!!!! আমি যা দেখেছি তা বিশ্বাস করতে পারছি না।
ইনিল


13

ভুলে যাবেন না যে এনএসউইন্ডো কনট্রোলার এবং এনএসভিউকন্ট্রোলার তাদের দ্বারা পরিচালিত NIB ফাইলগুলির শীর্ষ স্তরের অবজেক্টগুলি প্রকাশ করবে।

আপনি যদি ম্যানুয়ালি একটি এনআইবি ফাইল লোড করেন তবে আপনি যখন এনআইবির শীর্ষ-স্তরের বস্তুগুলি সেগুলি সম্পন্ন করার পরে মুক্ত করার জন্য আপনি দায়বদ্ধ।


12

কোনও শিক্ষানবিশকে ব্যবহার করার পরিবর্তে সুস্পষ্ট একটি: আপনার কোডের জন্য এক্সকোডের অটো-ইন্ডেন্টেশন বৈশিষ্ট্যটি ব্যবহার করুন। এমনকি আপনি যদি অন্য কোনও উত্স থেকে অনুলিপি / আটকানো হয়ে থাকেন তবে একবার আপনি কোডটি আটকানো হয়ে গেলে আপনি কোডের পুরো ব্লকটি নির্বাচন করতে পারেন, এটিতে ডান ক্লিক করুন এবং তারপরে সেই ব্লকের মধ্যে থাকা সমস্ত কিছুকে পুনরায় ইনডেন্ট করার বিকল্পটি বেছে নিতে পারেন।

এক্সকোড প্রকৃতপক্ষে that বিভাগটি বিশ্লেষণ করবে এবং এটি বন্ধনী, লুপ ইত্যাদির উপর ভিত্তি করে প্রবর্তন করবে এবং প্রতিটি লাইনটির জন্য স্পেস বার বা ট্যাব কী চাপানোর চেয়ে অনেক বেশি দক্ষ।


এমনকি আপনি ট্যাবটি ইনডেন্টে সেট করতে পারেন এবং তারপরে Cmd-A এবং ট্যাব করতে পারেন।
প্লুম্যানেটর

10

আমি জানি প্রথম যখন কোকো প্রোগ্রামিংয়ের সাথে প্রবেশ করলাম তখন আমি এটিকে উপেক্ষা করেছি।

নিশ্চিত হয়ে নিন যে আপনি এনআইবি ফাইল সম্পর্কিত মেমরি পরিচালনার দায়িত্বগুলি বোঝে। আপনার লোড হওয়া কোনও এনআইবি ফাইলের শীর্ষ স্তরের অবজেক্টগুলি মুক্ত করার জন্য আপনি দায়বদ্ধ। বিষয়টিতে অ্যাপলের ডকুমেন্টেশন পড়ুন ।


6
এটি সত্য নয়। আপনি শীর্ষ-স্তরের অবজেক্টগুলি মুক্ত করার জন্য দায়বদ্ধ কিনা তা নির্ভর করে আপনি কোন শ্রেণীর কাছ থেকে উত্তীর্ণ হন এবং কোন প্ল্যাটফর্মটি আপনি ব্যবহার করছেন on অন্যদের মধ্যে বিকাশকারী.অ্যাপল. com/ ডকুমেন্টেশন / কোকো / কনসেপ্টুয়াল / মেমরি এমজিএমটি / ডি দেখুন ।
এমএমএলসি

10

সমস্ত জিসিসির সতর্কতাগুলি চালু করুন, তারপরে অ্যাপল এর শিরোনামগুলি নিয়মিত গোলমাল হ্রাস করার কারণে সেগুলি বন্ধ করুন।

ঝনঝন স্থির বিশ্লেষণ ঘন ঘন চালান; আপনি "রান স্ট্যাটিক বিশ্লেষক" বিল্ড সেটিংসের মাধ্যমে সমস্ত বিল্ডের জন্য এটি সক্ষম করতে পারেন।

ইউনিট পরীক্ষা লিখুন এবং প্রতিটি বিল্ড দিয়ে তাদের চালান।


এবং, যদি আপনি পারেন তবে "সতর্কতাগুলি ত্রুটি হিসাবে বিবেচনা করুন" চালু করুন। কোন সতর্কতা উপস্থিত থাকার অনুমতি দিন।
পিটার হোসি

2
প্রস্তাবিত সতর্কতা সহ আপনার প্রকল্পটি সেট আপ করার জন্য একটি সহজ স্ক্রিপ্ট এখানে উপলভ্য: ভাড়াটিজ.টাম্বলআর
জোহান কুল

10

চলক এবং বৈশিষ্ট্য

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


9

আরও কার্যকর হতে হবে

অবজেক্টিভ-সি হ'ল অবজেক্ট-ওরিয়েন্টেড ভাষা, তবে কোকোয়া ফ্রেমওয়ার্ক কার্যকরী-শৈলী সচেতন, এবং এটি বেশ কয়েকটি ক্ষেত্রে কার্যকরী শৈলীর নকশা করা হয়েছে।

  1. পরিবর্তনের বিচ্ছেদ রয়েছে। প্রাথমিক হিসাবে অপরিবর্তনীয় শ্রেণি এবং মাধ্যমিক হিসাবে পরিবর্তনীয় বস্তু ব্যবহার করুন । উদাহরণস্বরূপ, প্রাথমিকভাবে এনএসআরাই ব্যবহার করুন, এবং আপনার যখন প্রয়োজন হবে তখনই এনএসমিটেবলআরে ব্যবহার করুন।

  2. খাঁটি ফাংশন আছে। এতগুলি নয়, অনেকগুলি ফ্রেমওয়ার্ক এপিআই কিনুন খাঁটি ফাংশনের মতো নকশাকৃত। যেমন ফাংশন তাকান CGRectMake()বা CGAffineTransformMake()। স্পষ্টতই পয়েন্টার ফর্মটি আরও দক্ষ দেখায়। তবে পয়েন্টারগুলির সাথে অপ্রত্যক্ষ যুক্তি পার্শ্ব-প্রতিক্রিয়া মুক্ত প্রস্তাব করতে পারে না। নিখুঁতভাবে যতটা সম্ভব কাঠামো ডিজাইন করুন। এমনকি রাষ্ট্রের বস্তু পৃথক করুন। অন্য বস্তুতে কোনও মান পাস করার -copyপরিবর্তে ব্যবহার করুন -retain। কারণ ভাগ করে নেওয়া স্থিতি নিঃশব্দে অন্য বস্তুর মানকে রূপান্তরকে প্রভাবিত করতে পারে। সুতরাং পার্শ্ব-প্রতিক্রিয়া-মুক্ত হতে পারে না। যদি আপনার অবজেক্ট থেকে বাইরের কোনও মান থাকে তবে এটি অনুলিপি করুন। সুতরাং এটি যতটা সম্ভব ন্যূনতম ভাগ করে নেওয়া রাষ্ট্রের নকশা করাও গুরুত্বপূর্ণ।

তবে খুব অশুচি ফাংশন ব্যবহার করে ভয় পাবেন না।

  1. অলস মূল্যায়ন আছে। -[UIViewController view]সম্পত্তির মতো কিছু দেখুন । বস্তুটি তৈরি হওয়ার সময় দৃশ্যটি তৈরি করা হবে না। কলার viewপ্রথমবারের মতো সম্পত্তি পড়ার সময় এটি তৈরি করা হবে। UIImageএটি আঁকানো না হওয়া পর্যন্ত লোড করা হবে না। এই নকশা মত অনেক বাস্তবায়ন আছে। এই ধরণের ডিজাইনগুলি রিসোর্স পরিচালনার জন্য খুব সহায়ক, তবে যদি আপনি অলস মূল্যায়নের ধারণাটি জানেন না, তবে তাদের আচরণ বোঝা সহজ নয়।

  2. বন্ধ আছে। যথাসম্ভব সি-ব্লক ব্যবহার করুন। এটি আপনার জীবনকে ব্যাপকভাবে সরল করবে। তবে এটি ব্যবহারের আগে ব্লক-মেমরি-পরিচালনা সম্পর্কে আরও একবার পড়ুন।

  3. সেমি-অটো জিসি আছে। NSAutoreleasePool। ব্যবহার করুন -autoreleaseপ্রাথমিক। -retain/-releaseআপনার সত্যিকারের প্রয়োজন হলে ম্যানুয়াল মাধ্যমিকটি ব্যবহার করুন । (উদা: মেমরি অপ্টিমাইজেশন, সুস্পষ্ট সংস্থান মুছে ফেলা)


2
3 হিসাবে) আমি বিপরীত পদ্ধতির প্রস্তাব করব: ম্যানুয়াল ধরে রাখুন / যেখানেই সম্ভব মুক্তি দিন! এই কোডটি কীভাবে ব্যবহার করা হবে কে জানে - এবং যদি এটি একটি শক্ত লুপে ব্যবহৃত হয় তবে এটি অযথা আপনার স্মৃতি ব্যবহার উড়িয়ে দিতে পারে।
ইকো

@ আইকো এটি একটি অকাল অপটিমাইজেশন , সাধারণ দিকনির্দেশনা হতে পারে না।
ইওনিল

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

@ আইকো আমি সম্মতি দিচ্ছি autoreleaseসাধারণত মেমরি দীর্ঘকাল ধরে রাখবে, এবং ম্যানুয়াল retain/releaseক্ষেত্রে মেমরির খরচ কমাতে পারে। তবে এটি বিশেষ ক্ষেত্রে অপ্টিমাইজেশনের জন্য দিকনির্দেশনা হওয়া উচিত (এমনকি আপনি সর্বদা বোধ করছেন!), অনুশীলন হিসাবে অকাল অপ্টিমাইজেশানকে সাধারণ করার কারণ হতে পারে না । এবং আসলে, আপনার পরামর্শ আমার থেকে বিপরীত নয়। আমি এটি সত্যই প্রয়োজনের হিসাবে উল্লেখ করেছি :)
এওনিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.