# প্রাথমিক ধারনা এবং Xcode

**ভূমিকাঃ** *অবজেক্টিভ-সি একটি রিফ্লেকটিভ, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা যাতে সি ভাষার সাথে স্মলটকের মেসেজ আদান পদ্ধতির সম্মিলন ঘটেছে। বর্তমানে এটি মূলত ম্যাক ওএস এক্স, আইওএস ও জিএনইউ স্টেপ সিস্টেমে ব্যবহৃত হয়। এই তিনটি সিস্টেম নির্মিত হয়েছে ওপেনস্টেপ স্ট্যান্ডার্ডের ওপর ভিত্তি করে যা নেক্সটস্টেপ, ওপেনস্টেপ ও কোকোয়া ফ্রেমওয়ার্কের প্রধান ভাষা। সাধারণ অবজেক্টিভ-সি প্রোগ্রাম অবশ্য এই ফ্রেমওয়ার্ক ব্যবহার করে না, বরং অবজেক্টিভ-সি কম্পাইলার সমৃদ্ধ জিসিসি সমর্থিত যেকোন সিস্টেমেই চলে।* - [উইকি](http://bn.wikipedia.org/wiki/%E0%A6%85%E0%A6%AC%E0%A6%9C%E0%A7%87%E0%A6%95%E0%A7%8D%E0%A6%9F%E0%A6%BF%E0%A6%AD_%E0%A6%B8%E0%A6%BF)

Objective-C হচ্ছে iOS এবং OSX অপারেটিং সিস্টেমের জন্য ন্যাটিভ প্রোগ্রামিং ল্যাঙ্গুয়েজ। এটা একটা কম্পাইল্ড ল্যাঙ্গুয়েজ। অর্থাৎ পুরো কোড আগে কম্পাইল হয়ে তারপর সেখান থেকে বিল্ড এবং রান হয়। Objective-C তৈরি করা হয়েছে C প্রোগ্রামিং ল্যাঙ্গুয়েজকে অবজেক্ট ওরিয়েন্টেড ফিচার দিয়ে। C এর তুলনায় Objective-C এর সিনট্যাক্সকে আরও বেশি হিউম্যান রিডেবল মনে করা হয়।

তুলনামুলক সিম্পল সিনট্যাক্স এর এই ল্যাঙ্গুয়েজ এর পিছনে আরও অবদান রয়েছে বিশাল বিস্তৃত কিছু লাইব্রেরীর। যদিও ল্যাঙ্গুয়েজের শেখার দৃষ্টিকোণ থেকে দেখতে গেলে ওই লাইব্রেরী গুলো সম্পর্কে এখনি জানা বাধ্যতামূলক নয় কিন্তু কিছুটা আইডিয়া রাখা ভালো। অনেক লাইব্রেরীর মধ্যে Apple এর Cocoa এবং Cocoa Touch ফ্রেমওয়ার্ক হচ্ছে বহুল পরিচিত। এগুলো কিছু API ডিফাইন করে যা দিয়ে যথাক্রমে OSX এবং iOS এর জন্য অ্যাপ্লিকেশন তৈরি করা সহজ হয়ে যায়। Foundation, UIKit, AppKit, CoreData QuartzCore, AVFoundation হচ্ছে তেমন কিছু ফ্রেমওয়ার্ক। Objective-C তে পারদর্শী হবার পর উপরে আলোচিত টুলস গুলো হচ্ছে iOS এবং OSX এর জন্য অ্যাপ তৈরির ক্ষেত্রে প্রয়োজনীয় জিনিষ। আপাতত এই ল্যাঙ্গুয়েজ নিয়ে ঘাটা ঘাটি করতে আমরা শুধুমাত্র Foundation ফ্রেমওয়ার্ক ব্যবহার করতে পারি।

**Xcode:** যদিও Objective-C কোড কম্পাইল করার জন্য আরও অনেক পথ আছে কিন্তু আমরা এই সিরিজে শুরু থেকেই Xcode ব্যবহার করবো কারন শেষ নাগাদ iOS, OSX অ্যাপ ডেভেলপ করাই আমাদের উদ্দেশ্য এবং তার জন্য Xocode এর সাথে পরিচিত থাকা অবশ্যই উপকারী। Xcode হচ্ছে Apple এর একটি IDE (Integrated Development Environment). তাছাড়াও এটা একটা কোড এডিটর, ডিবাগার টুল, অ্যাপ এর GU ইন্টারফেস বিল্ডার এবং এর সাথে সিমুলেটরও আছে।

**Objective-C প্র্যাকটিসের উপযোগী অ্যাপ/এনভায়র্নমেন্ট তৈরিঃ** iOS এবং OSX অ্যাপ তৈরি শুরু করার জন্য Xcode আমাদেরকে অনেক রকম টেম্পলেট করে দিতে পারে। আমরা আমাদের এই টিউটোরিয়াল সিরিজের স্বার্থে, Command Line Tool টাইপের অ্যাপ টেম্পলেট ব্যাবহার করবো। এতে করে আমরা iOS/OSX অ্যাপ তৈরির জন্য অন্যসব টুলস থেকে দুরে থাকতে পারবো এবং শুধুমাত্র Obejctive-C সম্পর্কে জানার জন্য যতটুকু পরিবেশ দরকার সেটাই তৈরি করে আগাবো। Xcode এর File->New->Project এ গেলে নিচের মত উইন্ডো আসবে। [![Screen Shot 2014-05-05 at 5.34.53 PM](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-34-53-pm.png?w=460)](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-34-53-pm.png) সেখানকার বাম পাস থেকে OSX : Application সিলেক্ট করে ডান পাস থেকে Command Line Tool সিলেক্ট করে Next করলে নিচের মত আরেকটি উইন্ডো আসবে। [![Screen Shot 2014-05-05 at 5.35.32 PM](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-35-32-pm.png?w=460)](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-35-32-pm.png) এখানে অ্যাপ এর ব্যাসিক কিছু সেটিংস কনফিগার করা হয়। Product Name এবং Organization Name এ যা খুশি দিতে পারেন এবং Company Identifier এ edu.self দিতে পারেন private use identifier হিসেবে, যদি আপনার দেয়ার মত কোন ইউনিক রিভার্স ডোমেইন না থাকে। Type ফিল্ড থেকে Foundation সিলেক্ট করুন কারন আমরা সামনে এই ফ্রেমওয়ার্কে ডিফাইন করা বেশ কিছু ক্লাসের ব্যবহার পাবো। এখন Next ক্লিক করে প্রজেক্ট শেভ লোকেশন দেখিয়ে দিন।

[![Screen Shot 2014-05-05 at 5.36.09 PM](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-36-09-pm.png?w=460)](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-5-36-09-pm.png)

Create বাটনে ক্লিক করার পর Xcode এর বাম পাশের ন্যাভিগেটর-এ main.m ফাইল সহ আরও কিছু ফাইল ফোল্ডার দেখতে পাবেন। আপাতত এই main.m ফাইলটাই গুরুত্বপূর্ণ। কারন iOS, OSX এমনকি Command Line Tool টাইপের অ্যাপ রান করার সময় এখান থেকেই ঘটনা শুরু হয় :) আর হ্যাঁ, .m হচ্ছে Objective-C এর সোর্স ফাইলের এক্সটেনশন।

**main() ঘটনাঃ** আগেই বলা হয়েছে, main() ফাংশন যেকোনো রকম Objective-C অ্যাপ এর রুট হিসেবে কাজ করে। Xcode প্রায় সব সবরকম অ্যাপ টেম্পলেট তৈরি করার সময় তার জন্য একটি main.m ফাইল বানায় যেখানে একটি main() ফাংশন ডিফাইন করা থাকে। ফাইলটি খুললে নিচের মত কোড দেখা যাবেঃ

```
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");

    }
    return 0;
}
```

@autoreleasepool ব্লকের মধ্যে আমরা আমাদের সবরকম প্র্যাকটিস কোড লিখবো। @autoreleasepool হচ্ছে মেমোরি লিক প্রতিহত করার একটা উপায়। যদিও এটা আমাদের টিউটোরিয়াল সিরিজের মুল বিষয় থেকে আলাদা, তবুও এই বিষয়ে জানতে পারেন [এখানে](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html)। Apple ডকু থেকে - *"The @autoreleasepool statement is there to support memory management for your app. Automatic Reference Counting (ARC) makes memory management straightforward by getting the compiler to do the work of keeping track of who owns an object; @autoreleasepool is part of the memory management infrastructure."*

তো, @autoreleasepool এর কথা আপাতত মাথা থেকে বাদ দিলে বলা যায় যে, main() ফাংশন সিমপ্লি NSLog() নামের একটা গ্লোবাল ফাংশনকে কল করে যেটা Foundation ফ্রেমওয়ার্কে এ ডিফাইন করা আছে। Xcode console এ ম্যাসেজ প্রিন্ট করার জন্য এটা ব্যবহার করা হয়। শুরুতে @ চিহ্ন ব্যবহার করে Objective-C string টাইপের ভ্যালু ডিফাইন করা হয়, যেটা পাঠানো হচ্ছে NSLog() এর প্যারামিটার হিসেবে।

Command+R চেপে অ্যাপটি রান করালে Xcode এর Editor এরিয়ার নিচের ডিবাগ কনসোলে নিচের মত ম্যাসেজ দেখা যাবে। [![Screen Shot 2014-05-05 at 6.00.24 PM](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-6-00-24-pm.png?w=460)](http://nuhil.files.wordpress.com/2014/05/screen-shot-2014-05-05-at-6-00-24-pm.png) এই টিউটোরিয়াল সিরিজে আমরা main.m ফাইল এডিট করে করে Objective-C ল্যাঙ্গুয়েজ ফিচার টেস্ট করবো। কিন্তু বাস্তবে iOS/OSX অ্যাপ তৈরির সময় এই ফাইলে হাত দেয়ার দরকার পরবে না। কারন, Xcode দিয়ে অন্য টাইপের অ্যাপ টেম্পলেট তৈরি করলে দেখবেন main() ফাংশনের মধ্যে application object এবং app delegate ইন্সট্যান্স তৈরি করে পুরো প্রোগ্রাম এর কন্ট্রোল ছেড়ে দেয়া হচ্ছে Application Delegate এর কাছে এবং এটা করেই main() এর কাজ শেষ। তো, ব্যাপার হচ্ছে, এটাও আপাতত গবেষণার বিষয় না। আপাতত আমরা ল্যাঙ্গুয়েজ হিসেবে Objective-C এর ফিচার টেস্ট করবো, অ্যাপ ডেভেলপমেন্ট নয়।

পরের পোস্টে ব্যাসিক সিনট্যাক্স, ভ্যারিয়েবল, কন্ডিশন, লুপ, ম্যাক্রো, ডাটা স্ট্রাকচার নিয়ে আলোচনা হবে।

Originally Posted [Here](http://nuhil.net/2014/05/05/%E0%A7%A7%E0%A6%83-objective-c-%E0%A6%AA%E0%A7%8D%E0%A6%B0%E0%A6%BE%E0%A6%A5%E0%A6%AE%E0%A6%BF%E0%A6%95-%E0%A6%A7%E0%A6%BE%E0%A6%B0%E0%A6%A8%E0%A6%BE-%E0%A6%8F%E0%A6%AC%E0%A6%82-xcode/)
