iOS Resources for developer

iOS developer တွေ အနေနဲ့ အသုံးဝင်တဲ့ resource အချို့တွေက

Cocoa Control

iOS မှာ အခြား သူတွေ အသုံးပြုထားတဲ့ control တွေကို လွယ်လင့် တကူ ရှာဖွေ အသုံးပြုနိုင်ပါတယ်။ တော်တော်များများကတော့ github မှာ share ထားပြီးထားသားပါ။ http://cocoacontrols.com က resource တွေ အားလုံးကို စုစည်းထားပေးတာပါ။ တော်တော်လေးကို အသုံးဝင်ပါတယ်။ ဥပမာ။။ twitter ipad version လိုမျိုး ဖန်တီးချင်တယ်ဆိုရင် လွယ်လင့်တကူ ရှာဖွေနိုင်ပါတယ်။

iOS Weekly

iosdevweekly.com ကို iOS Developer တိုင်း subscribe လုပ်ထားသင့်ပါတယ်။ အပတ်စဉ် iOS devleopment နဲ့ ပတ်သက်ပြီး အသုံးဝင်တဲ့ newsletter တွေ ပို့ပေးပါတယ်။ ပုံမှန်အားဖြင့် News , Design, Code , Tool ဆိုပြီး Section ၄ ခု ပါပါတယ်။

Continue reading “iOS Resources for developer”

Font embed in iPhone Titanium

အရှေ့ မှာတုန်းကတော့ Android Titanium မှာ font embed လုပ်တဲ့ အကြောင်းပြောပြီးပါပြီ။ အခု iphone အတွက် လုပ်ကြည့်ရအောင်။ Android မှာ ရေးထားတဲ့ code အတိုင်းပဲ ရေးပြီးတော့ iphone အတွက် config လေးတွေ နည်းနည်း လုပ်ရပါမယ်။

အရင်ဆုံး project folder အောက်က build ဆိုတဲ့ folder ကို သွားပါ။ အဲမှာ android နဲ့ iphone ဆိုတဲ့ folder ၂ ခုတွေ့ပါမယ်။ iphone ဆိုတဲ့ folder ထဲဝင်ပြီး info.plist ကို copy ကူးပါ။

ပြီးရင်တော့ project folder အောက်မှာ paste လုပ်လိုက်ပါ။

Paste လုပ်ထားတဲ့ info.plist ကို ဖွင်ပြီးတော့ Fonts provoide by application ဆိုပြီး အသစ် တစ်ကြောင်း ထပ်ဖြည့်ပါ။ အလိုလို Array data type ရွေးသွားပေးပါမယ်။ ပြီးရင် item-0 မှာ ကိုယ် အသုံးပြုမယ့် font file ကို ထည့်ပေးပါ။

ပြီးရင် build folder ထဲကို ပြန်သွားပြီး iphone folder တစ်ခုလုံးကို ဖျက်လိုက်ပါ။

ဖျက်ပြီးသွားရင်တော့ Resources folder ကို သွားပြီး font file ကို ထည့်ပါ။

ပြီးရင် compile လုပ်လိုက်ပါ။ အဲဒီ အခါ သူ့အလိုလို build အောက်မှာ iphone porject သွားဆောက်ပါလိမ့်မယ်။ ပြီးသွားရင်တော့ iphone မှာ ဇော်ဂျီ မြင်ရတာကို တွေ့ရပါလိမ့်မယ်ဗျာ။


Font Embed in Android Titanium

ဒီနေ့ Titanium Mobile SDK အသစ်မှာ Android အတွက် font embed ပါလာပါပြီ။ ဒါကြောင့် Titanium ကို အသုံးပြုပြီး မြန်မာ စာ အသုံးပြုတဲ့ iphone, android app တွေ ရေးလို့ရပါပြီ။ အရင် version တုန်းကတော့ iPhone တစ်ခုတည်းမှာ ရခဲ့ပေမယ့် အခု version မှာတော့ Android အတွက်ပါ ရလာပါပြီ။

How to

Titanium မှာ project အသစ် တစ်ခု ဆောက်လိုက်ပါ။

Continue reading “Font Embed in Android Titanium”

Mobile App Development

Mobile app development နဲ့ ပတ်သက်ပြီး အခြေခံ အဆင်လေးကို presentation လေးလုပ်ထားတာပါ။ MZ ပွဲမှာ ပြမလို့ စဉ်းစားထားပေမယ့် အသံ quality သိပ်မကောင်းတာကြောင့် ပြဖြစ်မယ် မထင်ပါဘူး။ အခုမှ mobile app ကို လုပ်ချင်တဲ့ လူတွေအတွက်တော့ အသုံးဝင်မယ့် video ဖြစ်မယ်လို့ ထင်ပါတယ်။

Install Cocos2d-iphone

Cocos2d ဟာ iPhone 2D Game ရေးဆွဲဖို့အတွက် opensource framework တစ်ခုပါ။ game တွေကိ ုမြန်ဆန်လွယ်ကူအောင် ရေးဆွဲဖို့အတွက် framework တွေထဲက opensource framework တစ်ခုပါ။ အခု iphone အတွက် ဖြစ်တဲ့အတွက်ကြောင့် Mac OS 10.6 နဲ့Xcode ရှိထားဖို့လိုပါတယ်။ Cocos2d က အစက python နဲ့ရေးထားပြီးတော့ objective-c အတွက် သီးသန့် ပြန်ရေးထားတယ်လို့ ဆိုပါတယ်။

ဟုတ်ပြီ။ ကျွန်တော်တို့ အရင်ဆုံး http://www.cocos2d-iphone.org/download မှာ download လုပ်လိုက်ပါ။ stable version က cocos2d-iphone-0.99.4.tar.gz ပါ။ rc version ကတော့ cocos2d-iphone-0.99.5-rc1.tar.gz ပါ။ rc1 အခြေအနေ ရောက်နေတဲ့အတွက် stable မဖြစ်ပေမယ့် တော်တော် အဆင်ပြေပါတယ်။ 0.99.5 နဲ့ o.99.4 က ကွာတဲ့ အချက်တွေ ရှိပါတယ်။ 0.99.5 မှာ iPhone 4 retina display အတွက် hd image တွေ ထည့်လို့ရလာပါတယ်။ 0.99.4 ကတော့  iPhone 4 မှာ hd အနေနဲ့ support မရနိုင်ပါဘူး။ ဒါကြောင့် 0.99.5rc1 ကိုပဲ download ချစေချင်ပါတယ်။

cocos2d-iphone-0.99.5-rc1.tar.gz ကို ဖြည်လိုက်ပါ။ ပြီးရင် terminal ဖွင်ပြီး ဖြည်ထားတဲ့ folder ကို သွားလိုက်ပါ။

Terminal မှာ

$sudo sh install-templates.sh

ဆိုပြီး ရိုက်ပြီး cocos2d ကို သွင်းနိုင်ပါတယ်။ ပြီးရင် xCode ကို ဖွင့်လိုက်ပါ။ Create new project လုပ်လိုက်ရင် cocos2d template ကို user template အောက်မှာ တွေ့ပါလိမ့်မယ်။

အခု cocos2d သွင်းလို့ရသွားပြီဆိုတော့ နောက်ပိုင်း cocos2d နဲ့ game ရေးပုံလေးတွေ ဆက်လက်ရေးသားပေးပါ့မယ်။

Starting Game Development

အရင်အလုပ် web development ကနေ ဘာမှ မဆိုင်တဲ့ iphone game development ကို ရောက်သွားတော့ စာတွေတော်တော် ပြန်ဖတ်လိုက်ရတယ်။ နောက်ပြီး မသိတာတွေ တော်တော်များများလည်း လေ့လာလိုက်ရတယ်။ Game Devloper လုပ်ချင်တဲ့ သူတွေ အရင်ဆုံး ကိုမြင့်ကျော်သူရေးထားတဲ့ post လေးတွေကို ဖတ်သင့်တယ်။ ကိုမြင့်ကျော်သူကတော့ Game Dev နဲ့ ပတ်သက်လာရင် ဆရာကြီး တစ်ဆူလို့တောင် ဆိုလို့ရမယ်။ မြန်မာနိုင်ငံကနေ နိုင်ငံတကာကို game ရောင်းနေတဲ့ Total Game Studio ဆိုပြီး အောင်မြင်တဲ့ Game Studio တစ်ခုလည်း ရှိတယ်။ ဒါကြောင့် Game Developer မလုပ်ခင်မှာ သူရေးထားတဲ့ post လေးတွေကို ဖတ်သင့်ပါတယ်။
Continue reading “Starting Game Development”

Learn Objective-C : Day 6

ဒီနေ့တော့ Day 6 ရောက်ပါပြီ။ ဒီနေ့က categories လို့ခေါ်တဲ့ cocoa Touch အကြောင်းပါ။ လက်ရှိ object တွေကို implement ထပ်လုပ်တဲ့အကြောင်းပေါ့။ အရင်တုန်းက ရေးခဲ့တဲ့ အပိုင်းတွေကတော့

Other Articles In This Series

Categories

Categories ဆိုတာ ဘာလဲ ? Objective-C tutorials တော်တော်များများမှာ categories ကို တွေ့နိုင်ပါတယ်။ အလွန်ပဲ အသုံးဝင်ပြီးတော့ code ကော သပ်သပ်ရပ်ရပ် ဖြစ်စေတယ်ဆိုလည်း မမှားပါဘူး။ အခုကျွန်တော်တို့တွေ မကြာခင် လေ့လာရတော့မှာပါ။ NSString function မှာ ကျွန်တော်တို့ ကိုယ်ပိုင် function တွေ ထည့်ချင်တဲ့ အခါတွေရှိပါတယ်။ ဥပမာ။။ a chatacters တွေကို 4 ပြောင်းလိုက်တဲ့ function မျိုးပေါ့။ ကျွန်တော်တို့တွေ NSString ကို subclass ရှိပြီး ကိုယ်တိုင် method ကိုယ့်ဘာသာကိုယ် ထည့်သွင်းနိုင်ပါတယ်။ subclass ပိုင်းကို ကျွန်တော်တို့တွေ car class ဆောက်တုန်းက တွေ့မြင်ဖူးမှာပါ။ subclass က တော်တော်ကောင်းမွန်ပါတယ်။ သို့ပေမယ့် categories က ပိုပြီး ပြည့်စုံကောင်းမွန်တယ်လို့ ဆိုလို့ရပါတယ်။

Categories က ကျွန်တော်တို့တွေကို methods အသစ်တွေကို ရှိနေတဲ့ class မှာ ထပ်ဖြည့်ထည့်ခွင့်ပေးထားပါတယ်။ ဥပမာ။။ 100 NSString Objects ကို သင့် app မှာ သုံးထားတယ်ဆိုပါဆို့။ reverstring function ကို extra method အနေနဲ့ ထည့်ချင်တယ်ဆိုရင်တော့ custom subclass ကို အသုံးပြုနိုင်ပါတယ်။ သို့ပေမယ့် Categories နဲ့ဆိုရင်တော့ ပိုပြီး ရိုးရှင်းပြီး လွယ်ကူတယ်လို့ ဆိုနိုင်ပါတယ်။ နောက်ပြီး ရှိနေဲ့ method တွေကိုလည်း overwrite လုပ်ပြီး အစားထိုးဖို့ကလည်း ဖြစ်နိုင်ပါတယ်။ Continue reading “Learn Objective-C : Day 6”

UITableView Edit to Done Button

ကျွန်တော် UITableView Delete Tutorial မှာ တုန်းက Edit button နှိပ်လိုက်ရင် Delete လုပ်ဖို့အတွက် ပြောင်းသွားပါတယ်။ Edit ပြန်နှိပ်လိုက်ရင် UITableView က Edit ပုံစုံပြောင်းသွားပေမယ့် Edit ကတော့ Done မပြောင်းသွားပါဘူး။ ပြောင်းသွားအောင် နည်းနည်း ပြင်ဖို့လိုပါတယ်။

Continue reading “UITableView Edit to Done Button”

UITableView Add Tutorial

မနေ့က UITableView Delete ကို ပြောပြီးပါပြီ။ အဲဒီ delete မှာပဲ နည်းနည်း ပြန်ပြင်ပါမယ်။

- (void)viewDidLoad {

ရဲ့ အောက်ဆုံးမှာ အောက်ကလို ဖြည့်လိုက်ပါ။ Add button ကို navigation bar ရဲ့ ညာဘက် ထိပ်ဆုံးမှာ ထည့်လိုက်တာပေါ့။

//Crate Add Button
UIBarButtonItem * addButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self action:@selector(addTable)];
self.navigationItem.rightBarButtonItem=addButton;

Continue reading “UITableView Add Tutorial”

UITableView Delete Tutorial

UITableView Tutorial ဆိုပြီးတော့ ကျွန်တော် ရေးပြီးပါပြီ။ ဆက်ပြီးတော့ ထည့်ထားတဲ့ record ကို ပြန်ဖျက်ဖို့ လုပ်ကြည့်ရအောင်။

ပထမဆုံး tableview နဲ့ ချိတ်ဆက်ဖို့အတွက် IBoutlet တစ်ခုကြေငြာဖို့လိုပါတယ်။ အဲဒီတော့ RootViewController.h မှာ ဒီလိုရေးလိုက်ပါတယ်။

#import

@interface RootViewController : UITableViewController {
NSMutableArray *listItem;
IBOutlet UITableView *tableview;
}
@property(nonatomic,retain) NSMutableArray *listItem;
@property(nonatomic,retain) IBOutlet UITableView *tableview;

@end

ပြီးရင်တော့

@synthesize tableview;

ကို RootViewController.m မှာ ဖြည့်ပေးဖို့နဲ့

[tableview release];

ကို dealloc မှာ ထည့်ပေးဖို့ မမေ့ဖို့လိုပါသေးတယ်။

RootViewController.xib ကို ဖွင့်ကြည့်လိုက်ပါ။ Bottom Bar မှာ Toolbar ရွေးလိုက်ပါ။ UITableView မှာ Toolbar ပေါ်လာပါလိမ့်မယ်။

အဲလို ပြောင်းပြီးရင် IBoutlet ချိတ်ဖို့အတွက် File’s Owner ကို click လုပ်ပါ။ ပြီးရင် ဒုတိယ tab ဖြစ်တဲ့ Connections Inspector ကို သွားပါ။ အဲဒီမှာ tableview ဆိုပြီး ပေါ်နေပါလိမ့်မယ်။ အဲဒီ tableview က ညာဘက် စက်ဝိုင်းလေးကို drag ဆွဲပြီး uitableview နဲ့ ချိတ်ပေးလိုက်ပါ။

ပြီးရင်တော့ coding ကို ပြန်သွားပါမယ်။
Continue reading “UITableView Delete Tutorial”

7 Cross Platform iOS and Android Solutions

iOS ကို သာမက Android ပါ run လို့ ရအောင် application တွေ ရေးဖို့အတွက် SDK List လေးပါ။

Native App Creators

Airplay SDK – သူကတော့ game company တော်တော်များများ အသုံးပြုကြပါတယ်။ cross platform applications အတွက် game ရေးဖို့ဆိုရင် အဆင်ပြေပါတယ်။ 2D/3D Game တွေ ရေးဖို့အတွက် အဆင်ပြေပါတယ်။

Corona SDK – Lua ကို သုံးပြီး app တွေရေးဖို့အတွက်ဆိုရင်တော့ Corona ရှိပါတယ်။ သူကတော့ Actionscript 2.0 နဲ့ တူပါတယ်။ Adobe Developer အဟောင်းတွေက တည်ထောင်ထားတာပါ။ တန်ဖိုးကတော့ $99 per year ပေးဆောင်ရပါတယ်။

Flash CS5 (Adobe Air for iOS ) – Packager ကို သုံးပြီး iOS အတွက် Flash CS5 apps တွေ ဖန်တီးလို့ရပါတယ်။ Mac ကို သုံးစရာမလိုပဲ ရေးလို့ရပါတယ်။ စျေးနှုန်းကတော့ $600 ဝန်းကျင်ရှိပြီးတော့ upgrade လုပ်တာဆိုရင်တော့ $200 ပေးရပါလိမ့်မယ်။

Unity – Game တွေအတွက် သီးသန့်ဆိုရင်တော့ Unity ရှိပါတယ်။ သူက 3D object တွေအတွက် Editor ပါပြီးသားဆိုတော့ တော်တော်လေးကို ကောင်းမွန်တယ်လို့ ဆိုရပါမယ်။ ထို့အတူ စျေးလည်း ကောင်းပါတယ်။ iPhone သီးသန့်အတွက် Unity ဆိုရင် $300 လောက်ပေးရမှာဖြစ်ပြီး Unity Pro ဆိုရင်တော့ $1500 လောက်ကုန်ပါလိမ့်မယ်။ Android အတွက်ပါရေးမယ်ဆိုရင်တော့ $3000 လောက်တော့ ကုန်ကျပါမယ်။

Hybrid App Creators (HTML/Javascript and HTML/ruby based)

Appcelerator – native app ကို HTML/Javascript ကို သုံးပြီး ရေးလို့ရမယ့် နည်းလမ်းပေါ့။ UIWebView ကို သုံးပြီး iPhone မှာ run တာပေါ့။ သူက Free ပါပဲ။

Phonegap – Appcelerator နဲ့ အတူတူပါပဲ။ သူကတော့ Appcelerator ထက်စာရင် ရေးရတာ ပိုလွယ်ပြီးတော့ support နဲ့ communities အားကောင်းတယ်လို့ ဆိုရပါမယ်။

Rhomobile – Ruby ကို သဘောကျတဲ့သူတွေအတွက်ကတော့ Rhomobile က အဆင်ပြေပါလိမ့်မယ်။ ROR သမားတွေ အကြိုက်ပေါ့။ noncommericial application အတွက် free ပါ။

Conclusion

Flash သမားတွေအတွက်တော့ Flash CS5 က အသင့်တော်ဆုံးပေါ့။ Airplay SDK ကတော့ စိတ်ဝင်စားဖို့ကောင်းတဲ့ SDK ဆိုလည်း မမှားပါဘူး။ Corona ကတော့ စျေးနည်းနည်းများတယ်လို့ ထင်ပါတယ်။ နောက်ပြီး Lua language ကိုလည်း လေ့လာဖို့ လိုလိမ့်မယ်။ Corona စျေးများတာကတော့ Unity စျေးများတာကို မမှီဘူးလို့ဆိုရမလားပဲ။ သို့ပေမယ့် Unity က Game Development အတွက် တော်တော်လေးကို ကောင်းမွန်ပါတယ်။ Game Development အတွက် invest မလုပ်ဘူးဆိုရင်တော့ မစဉ်းစားသင့်ပါဘူး။

HTML/Javascript solutions အတွက်ဆိုရင်တော့ Appcelerator ဖြစ်ဖြစ် Phonegap ဖြစ်ဖြစ် အဆင်ပြေပါတယ်။ web developer တွေအတွက် iPhone , Android app အမြန်ရေးဖို့အတွက်ပေါ့။ Appcelerator ကတော့ သူ့ javascript တွေ သိထားဖို့လိုတယ်။ ထပ်လေ့လာဖို့လိုတာပေါ့။ Phonegap ကတော့ လက်ရှိ HTML5 application ကို iPhone , Android အတွက် ချက်ခြင်း ပြောင်းလိုက်ရုံပဲလေ။ ROR သမားတွေအတွက်တော့ ထွေထွေထူးထူး ပြောစရာလိုမယ်မထင်။ Rhomobile က အဆင်ပြေဆုံး ဖြစ်လိမ့်မယ်။

reference: http://maniacdev.com/2010/09/cross-platform-iphone-and-android-solutions/

3 Opensource iPhone Game on App Store

iPhone game တွေထဲမှာလည်း Opensource Game လေးတွေ ရှိပါတယ်။ အောက်မှာပြထားတဲ့ game ၃ ခုဟာ လက်ရှိ app store မှာ ရှိနေတဲ့ game ပါ။

အဲဒီအတွက် source ကိုတော့ github မှာ ရှိထားပြီးသားပါ။

Continue reading “3 Opensource iPhone Game on App Store”

Learn Objective-C : Day 5

ကဲ… Part 5 ကိုတောင် ရောက်လာပါပြီဗျာ။ ဒီနေ့မှာတော့ memory mangagement အပိုင်းကို လေ့လာရအောင်။ Script Language တော်တော်များများ (PHP ကဲ့သို့ ) ဟာ memory management ပိုင်းကို အလိုအလျောက်ဆောင်ရွက်ပေးပါတယ်။ ဒါပေမယ့် Objective-C မှာကတော့ သတိထားဖို့လိုပါတယ်။ object ကို create လုပ်ပြီးရင် release လုပ်ပေးဖို့လည်းလိုပါတယ်။

Other Articles In This Series

iPhone Development လုပ်ပြီဆိုရင် memory management ပိုင်းက အရေးပါပါတယ်။ ဘာလို့လည်းဆိုတော့ iPhone က memory limit က Desktop နဲ့ ယှဉ်ရင် နည်းပါတယ်။

Two Approaches

Objective-C မှာ memory management အတွက် methods ၂ မျိုးရှိပါတယ်။ ပထမက reference counting နဲ့ ဒုတိယကတော့ garbage collection ပါ။ သင့်အနေနဲ့ စဉ်းစားလို့ရတာကတော့ manual နဲ့ automatic ပေါ့။ reference counting ဆိုတာက programmer က code ထည့်ပေးရပြီး garbage collection ကတော့ system ကို အလိုအလျောက် memory managing လုပ်ခိုင်းတာပေါ့။ Garbage collection က iPhone မှာ အလုပ်မလုပ်ဘူးဆိုတာကို သတိထားဖို့လိုပါတယ်။ အဲဒါက Mac developer တွေအတွက်သာ အသုံးဝင်ပါတယ်။

Reference Counting

ကဲ… ကျွန်တော်တို့app ကို memory manage ဘယ်လိုလုပ်မလဲ။ ပထမဆုံးအနေနဲ့ ဘယ်အချိန်မှာ code က memory ကို အသုံးပြုပါသလဲ။ ကျွန်တော်တို့တွေက class instance (object) ကို ဖန်တီးလုပ်ပြီဆိုတာနဲ့ memory က allocated လုပ်ပါတယ်။ object က သေးသေးလေးပေမယ့် app က တဖြည်းဖြည်း ကြီးလာတာနဲ့အမျှ memory ပြဿနာတွေက ဖြစ်လာနိုင်ပါတယ်။

ကဲ.. ဥပမာ တစ်ခုလောက် ကြည့်ရအောင်။ ကျွန်တော်တို့ Drawing App တစ်ခုဆွဲပါတယ်။ user ဆွဲတဲ့ shape တစ်ခုတိုင်းက separate object တွေပေါ့။ ကျွန်တော်တို့မှာ shpare 100 ဆိုရင် object 100 memory ပေါ်မှာ နေရာယူသွားပါလိမ့်မယ်။ screen ကို clear လုပ်ပြီး နောက်ထပ် shape 100 ထပ်ဆွဲမယ်။ ကျွန်တော်တို့ဟာ memory manage မလုပ်ခဲ့ရင် အသစ် shape 100 လည်းပြီးရော object 200 memory ပေါ်မှာ နေရာယူထားပြီလေ။ အဲလိုမျိုးတွေ လုပ်နေရင် ကြာလာတဲ့အခါမှာ memory တွေ အရမ်းစားပါလိမ့်မယ်။

ကဲ… ကျွန်တော်တို့ reference counting နဲ့ စဉ်းစားကြည့်ရအောင်။ create new object လုပ်လိုက်တိုင်း memory ပေါ်မှာ နေရာယူသွားတယ်။ object က count 1 ဖြစ်သွားပြီ။ နောက်ထပ် object ဆောက်ရင် retain count က 2 ဖြစ်သွားပြီ။ တကယ်လို့ release ပြန်လုပ်လိုက်ရင် retain count က decrease ဖြစ်ပြီး 1 ဖြစ်သွားပါလိမ့်မယ်။ ထပ်ပြီး decrease လုပ်လိုက်ရင် 0 ဖြစ်သွားမယ်။ zero ဆိုရင် ထိန်းမထားတော့ပဲ memory ပေါ်မှာ free ဖြစ်သွားပါပြီ။

Syntax

ကျွန်တော်တို့ ပထမဆုံး object တစ်ခုကို တည်ဆောက်ပါမယ်။ object တစ်ခုကို အောက်ကလို တည်ဆောက်ပါမယ်။

myCarClass *car = [myCarClass alloc];

ကျွန်တော်တို့ object ဆောက်ပြီးသွားရင် manual release သို့မဟုတ် autorelease ကို နောက်ပိုင်းမှာ လုပ်ပါမယ်။ သတိထားဖို့က object ကို manual release လုပ်ပြီးမှ autorelease ကို သွားခိုင်းလိုက်ရင် application က crash ဖြစ်သွားနိုင်ပါတယ်။

ကျွန်တော်တို့ oject ကို alloc နဲ့ တည်ဆောက်ပြီးပါပြီ။ အဲဒါတော့ reatin လုပ်ပါမယ်။ object က ဆောက်လိုက်တော့ object count က 1 ဖြစ်သွားပါပြီ။

[car reatin];

ထပ်ပြီး reatin လုပ်လိုက်တော့ count က 2 ဖြစ်သွားပါတယ်။ ဒါကြောင့် ကျွန်တော်တို့ ၂ ကြိမ် release လုပ်ပေးဖို့လိုပါတယ်။

Autorelease and Autorelease Pool’s

XCode မှာ create project တစ်ခုဆောက်တဲ့အခါမှာ အချို့ code တွေက autorelease အတွက် ရေးထားတာကို သတိပြုမိမှာပါ။ code က အောက်ကလို မျိုး ပုံစံလေးပေါ့

NSAutoreleasePool * pool =[[NSAutoreleasePool alloc] init];
[pool drain];

Note: documentation အဟောင်းတွေမှာတော့ နောက်ဆုံး လိုင်းက drain အစား release ဖြစ်နေမှာပါ။ တကယ်တန်းတော့ အတူတူပါပဲ။ drain ပဲ သုံးသုံး release ပဲ သုံးသုံးအဆင်ပြေပါတယ်။

အပေါ်က code က autorelease အတွက်အလုပ်လုပ်ထားတာပါ။ ကျွန်တော်တို့တွေက object ကို autorelase message ပို့ထားလိုက်ပါတယ်။ drain message ကို sent လိုက်တဲ့အခါမှာတော့ object က release လုပ်သွားပါတယ်။ autorelease က အသုံးဝင်ပါတယ်။ pool စဆောက်တဲ့အချိန်ကနေ drain မလုပ်ခင်ထိ သုံးထားတဲ့ object တွေကို drain လုပ်တဲ့အချိန်မှာ အကုန် release လုပ်လိုက်ပါတယ်။ ကျွန်တော်တို့တွေ object ကို reatin count လုပ်ပေးနေစရာမလိုတော့ပဲ relase လွယ်လွယ်ကူကူ လုပ်ပေးလိုက်လို့ရပါတယ်။

Nested Autorelease Pool’s

nested autorelease pool နဲ့ ပတ်သက်ပြီးတော့ အကြမ်းရှင်းပြပေးလို့ရပါတယ်။ အဲဒါကို ဘာကြောင့်သုံးရတာလဲ။ တစ်ခါတစ်လေ loop ပတ်နေတဲ့အချိန်မှာ tempoary object ကို ဆောက်တဲ့ အခါလေးတွေ ရှိပါတယ်။

ဥပမာ။။ loop လုပ်နေတဲ့အခါမှာ temporary object ၂ ခု ဆောက်လိုက်ပါတယ်။ မလိုချင်တဲ့အခါမှာ အဲဒါကို autorelease ပြန်လုပ်ဖို့လိုပါတယ်။ အောက်က code လေးကို လေ့လာကြည့်လိုက်ပါ။

void main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSArray *args = [[NSProcessInfo processInfo] arguments];

for (NSString *fileName in args) {

NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];

NSError *error = nil;
NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:fileName
encoding:NSUTF8StringEncoding error:&error] autorelease];

/* Process the string, creating and autoreleasing more objects. */

[loopPool drain];
}

/* Do whatever cleanup is needed. */
[pool drain];

exit (EXIT_SUCCESS);
}

အဲဒီ code လေးက တော်တော်ကောင်းပါတယ်။ အဲဒီမှာ ကျွန်တော်တို့အနေနဲ့ pool တစ်ခုကို စဆောက်လိုက်တယ်။ ပြီးတော့ loop ထဲဝင်တယ်။ Loop ထဲမှာ pool ကို ထပ်ဆောက်တယ်။ အဲဒီ အချိန်မှာပဲ object ၂ ခု ထပ်ဆောက်တယ်။ ပြီးတော့ loopPool ကို drain လုပ်လိုက်တယ်။ ဒါကြောင့် pool စဆောက်တဲ့အချိန်ကနေပြီး drain လုပ်တဲ့ကြားက object တွေကို autorelease လုပ်သွားပေးပါလိမ့်မယ်။ object တွေ create လုပ်ခဲ့တဲ့အတွက် စိုးရိမ်စရာမရှိတော့ဘူးပေါ့။ နောက်ဆုံး program ပြီးသွားတော့ drain ထပ်လုပ်လိုက်တယ်။ ရှိနေတဲ့ object တွေကို အကုန် clear လုပ်သွားပေးတယ်။

loop ထဲမှာ သုံးထားတဲ့အတွက် loop လုပ်တဲ့အချိန်မှာ object တွေများလာပြီး memory တွေစားမှာ စိုးရိမ်စရာမလိုတော့ဘူးပေါ့။ တကယ်လို့သာ release သာ ပြန်မလုပ်ပေးရင် loop တွေများလာလေလေ memory က သုံးတာ များလာလေလေ ဖြစ်မှာပေါ့။

retainCount

အပေါ်မှာတုန်းကတော့ reatin နဲ့ပတ်သက်ပြီးပြောထားပြီးပါပြီ။ reatin ဘယ်နှစ်ခုရှိလဲ သိဖို့အတွက် reatinCount ကို အသုံးပြုနိုင်ပါတယ်။

NSLog(@"retainCount for car: %d", [car retainCount]);

retainCount က integer ဖြစ်တဲ့အတွက်ကြောင့် %d ကို သုံးထားပါတယ်။

Wrapping Up

Memory management က new programmer တွေအတွက် အနည်းငယ် နားလည်ရခက်ခဲနိုင်ပါတယ်။ အထူးသဖြင့် script langauge က လာတဲ့ programmer တွေအတွက်လည်း ခေါင်းရှုပ်စေနိုင်ပါတယ်။ ဒါပေမယ့် Objective-C မှာက memory management ကို ကိုယ်ပိုင် စိတ်ကျ ဖန်တီးနိုင်တဲ့အတွက်ကြောင့် program ပေါ့ပါးမှုက programmer ရဲ့ object တည်ဆောက်မှုနဲ့ release လုပ်မှုပေါ်မှာ မူတည်နေပါတယ်။ နားမလည်တာတွေကို မေးနိုင်ပါတယ်။

Next Time

နောက်တစ်ပိုင်းမှာတော့ Objectiv-C နဲ့ ပတ်သက်ပြီး ရိုးရှင်းတဲ့ code တွေအကြောင်းရေးသားသွားပါအုံးမယ်။

reference: http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-5/

Learn Objective-C Day 4

ပြီးခဲ့တဲ့ အပိုင်းတွေကတော့ အခြေခံလေးတွေကို ပြန်နွှေးပြီးပါပြီ။ ပြီးခဲ့တဲ့ အပိုင်း တွေကတော့

ကဲ .. အခု Day 4 လေး စလိုက်ရအောင်

Getting Started

အရင်ဆုံး Xcode ကို ဖွင့်လိုက်ပါ။ MacOSX အောက်က Applications ကို ရွေးပြီး Command Line Tool ကို click လုပ်လိုက်ပါ။ Type ကို Foundation လို့ ရွေးလိုက်ပါ။ File name ကို အဆင်ပြေတာပေးပါလိုက်ပါ။ ကျွန်တော်ကတော့ CarApp လို့နာမည်ပေးလိုက်တယ်။ ပြီးရင် ကျွန်တော်တို့တွေ New Class ဆောက်ဖို့လိုပါတယ်။ Command-N သို့မဟုတ် File > New File ကို သွားပါ။ Coca Class အောက်က Objective-C Class ကို ရွေးပါ။ subclass ကတော့ NSObjective ပဲ။ Next လုပ်ပြီးနောက် SimpleCar.m ဆိုပြီး နာမည်ပေးလိုက်ပါ။ ပြီးရင် Finish လုပ်လိုက်ပါ။

Coding the Interface

SimpleCar.h ကို ဖွင့်လိုက်ရင် အောက်ကလို မြင်ရပါလိမ့်မယ်။

#import <Cocoa/Cocoa.h>

@interface SimpleCar : NSObject {

}

@end

ဆိုတဲ့ file လေး ရလာပါမယ်။ Cocoa.h ကြောင့် ကျွန်တော်တို့တွေ NSString, NSMutableString စတာတွေ အသုံးပြုလို့ရလာပါတယ်။ ဟုတ်ပြီ။ Car နဲ့ ပတ်သက်တဲ့ Attribute တွေ ကျွန်တော်တို့တွေ ထည့်ရအောင်။ ဘာတွေလည်းဆိုတော့

  • Make
  • Model
  • VIN

စတာတွေပေါ့။ တခြား Properties တွေ ရှိပေမယ့် အခုတော့ ဒီလောက်ပဲ ထည့်ထားပါမယ်။ အဲဒါကို Cocoa မှာ ဒီလို ရေးလိုက်ပါတယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

@end

ကျွန်တော် တို့တွေ ပြီးခဲ့တဲ့ နေ့တုန်းကပြောခဲ့ဘူးပါတယ်။ Data တွေကို ဖတ်ဖို့ ရေးဖို့အတွက် function တွေ လိုအပ်ပါတယ်။ ဒီတော့ ကျွန်တော်တို့ method တွေ ထည့်ပါမယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

// set methods

- (void) setVin: (NSNumber*)newVin;

- (void) setMake: (NSString*)newMake;

- (void) setModel: (NSString*)setModel;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

@end

ဒါတွေကတော့ ကျွန်တော် Class ရဲ့ SET mthod ပေါ့။ နောက်ပြီးတော့ Parameter ၂ ခုနဲ့ function တစ်ခု ပါထည့်သွင်းထားပါတယ်။ Data Type တွေ တူညီအောင် ကျွန်တော်တို့တွေ ထည့်ပေးဖို့လိုပါတယ်။ ဥပမာ။။ vin က NSNumber ဖြစ်တဲ့အတွက်ကြောင့် setVin ကိုလည်း NSSNumber paramter ပို့ထားတာပေါ့။ နောက်ပြီးတော့ method တွေကို @end မတိုင်ခင်နဲ့ } အဆုံးမှာ ရေးရတာကို သတိထားစေချင်ပါတယ်။ ဟုတ်ပြီ။ Set Method တော့ ပြီးပြီ။ Get method ရေးရအောင်။

// set methods

- (void) setVin: (NSNumber*)newVin;

- (void) setMake: (NSString*)newMake;

- (void) setModel: (NSString*)newModel;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

// get methods

- (NSString*) make;

- (NSString*) model;

- (NSNumber*) vin;

return ပြန်စရာလိုတဲ့အခါမှာတော့ ကျွန်တော်တို့တွေ (void) ကို သုံးလို့မရတော့ပါဘူး။ Return ပြန်မယ့် data type ကို ထည့်သွင်းပေးဖို့လိုပါတယ်။

Coding the Implementation

အခု ကျွန်တော်တို့တွေ SimpleCar.h မှာ ပါမယ့် variable တွေ mehtod တွေ ရေးပြီးပါပြီ။ SimpleCar.m မှာ ကျွန်တော်တို့တွေ စပြီး Implement လုပ်ဖို့ လိုလာပါပြီ။ အပေါ်က method တွေမှာ ပါတဲ့ အတိုင်း function တွေကို အောက်ကလို ချရေးလိုက်ပါတယ်။

#import "SimpleCar.h"

@implementation SimpleCar

// set methods

- (void) setVin: (NSNumber*)newVin{

}

- (void) setMake: (NSString*)newMake{

}

- (void) setModel: (NSString*)newModel{

}

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel{

}

// get methods

- (NSString*) make{

}

- (NSString*) model{

}

- (NSNumber*) vin{

}

@end

make , model , vin အတွက်ကတော့ return ပြန်ဖို့ပဲ လိုတဲ့အတွက် ဒီလို ထပ်ပြီး ရေးလိုက်တယ်။

- (NSString*) make {

return make;

}

- (NSString*) model {

return model;

}

- (NSNumber*) vin {

return vin;

}

ဒီမှာ တချက် သတိထားဖို့က ကျွန်တော် variable ကို return ပြန်လိုက်တာပါ။ Method Name က သပ်သပ် variable name က သပ်သပ်ပါ။ method name အတိုင်း return ပြန်တာ မဟုတ်ပါဘူး။ variable name အတိုင်း method name ကို လိုက်ရေးရတာ မဟုတ်ပါဘူး။

ကဲ.. ရှေ့ဆက်ရအောင်။ ကျွန်တော်တို့တွေ အခြား set method ကို implement လုပ်ဖို့ လိုပါပြီ။

// set methods

- (void) setVin: (NSNumber*)newVin {

[vin release];

vin = [[NSNumber alloc] init];

vin = newVin;

}

- (void) setMake: (NSString*)newMake {

[make release];

make = [[NSString alloc] initWithString:newMake];

}

- (void) setModel: (NSString*)newModel {

[model release];

model = [[NSString alloc] initWithString:newModel];

}

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel {

// Reuse our methods from earlier

[self setMake:newMake];

[self setModel:newModel];

}

ဒီ code ကို ကြည့်ရင် ရှုပ်ထွေးသွားပါလိမ့်မယ်။ အခြား Language တွေနဲ့ မတူတာက NSStirng တို့ NSNumber တို့ကို clear လုပ်ချင်တဲ့အခါမှာ release ဆိုတာလေးကို သုံးရပါတယ်။ နောက်ပြီးတော့ alloc နဲ့ init လုပ်ပေးဖို့လိုပါတယ်။ အခြား Language တွေနဲ့ မတူညီတဲ့ အချက်တွေကြောင့် ခေါင်းနည်းနည်း ရှုပ်ရတတ်ပါတယ်။ code တွေ ရေးပြီးရင်တော့ memory ပေါ်ကနေ ပြန်ရှင်းဖို့လိုပါတယ်။ program ကို ပိတ်တဲ့အခါမှာ memory ပေါ်ကနေ အကုန် ရှင်းချခဲ့ပေးရပါမယ်။

-(void) dealloc

{

[vin release];

[make release];

[model release];

[super dealloc];

}

ဆိုတာလေးကို ထပ်ဖြည့်လိုက်ပါတယ်။

ကဲ.. အခုတော့ Implementation အဆင့်တော့ ပြီးသွားပါပြီ။ နောက်တဆင့် Testing ပေါ့။

Testing the Class

ကဲ… အခု Test အဆင့်ကို ရောက်လာပါပြီ။ ကျွန်တော်တို့ ရေးထားတာတွေ မှန်မမှန် စမ်းရအောင်ဗျာ။

CarApp.m ကို ဖွင့်လိုက်ပါ။

#import <Foundation/Foundation.h>

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

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// insert code here…

NSLog(@”Hello, World!”);

[pool drain];

return 0;

}[/objc]

အဲလို မျိုး ရေးထားတာလေးကို တွေ့မှာပါ။ အဲလိုရေးထားတာလေးကို အောက်ကလို ပြင်ကြည့်ရအောင်။

#import &lt;Foundation/Foundation.h&gt;

#import "SimpleCar.h"

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

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

SimpleCar *myCar = [[SimpleCar alloc] init];

NSNumber *newVin = [NSNumber numberWithInt:123];

[myCar setVin:newVin];

[myCar setMake:@"Honda" andModel:@"Civic"];

NSLog(@"The car is: %@ %@", [myCar make], [myCar model]);

NSLog(@"The vin is: %@", [myCar vin]);

[myCar release];

[pool drain];

return 0;

}

အဲလိုလေး ရေးပြီးတဲ့အခါမှာတော့ Build and Run ကို နှိပ်လိုက်ပါ။ ဘာမှ မမြင်ရရင် Run > Console ကို နှိပ်လိုက်ပါ။ Console Log မှာ The car is: Honda Civic , The car is: 123 ဆိုပြီး ပေါ်လာတာကို တွေ့ရပါလိမ့်မယ်။

Property and Synthesize

ကဲ .. ကျွန်တော်တို့တွေ အဆင်ပြေပြေနဲ့ code တော့ ရေးပြီးသွားပြီ။ Objective-C နဲ့လည်း Class ဆောက်လို့ရသွားပြီ။ ဒါပေမယ့် code တွေက ရှည်နေတယ်။ အဲဒီအတွက် @property နဲ့ @synthesize ကို သုံးပြီး ချုံလို့ရပါတယ်။

ကျွန်တော်တို့တွေ ပြီးခဲ့ SimpleCar.h ကို အောက်ကလို ပြောင်းလိုက်ပါမယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

@property(readwrite, retain) NSString* make;

@property(readwrite, retain) NSString* model;

@property(readwrite, retain) NSNumber* vin;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

@end 

အများကြီးကို တိုသွားပါတယ်။ setMake နဲ့ vin method ၂ ခုကို ပေါင်းပြီး ရေးလိုက်တာပေါ့။ @property က Interface မှာ ကြေငြာထားတာတွေကို ပြန်ထည့်ထားတာပါ။ readwrite လုပ်မယ်လို့ ဆိုလိုတာပေါ့။ အဲလိုပြင်လိုက်တော့ SimpleCar.m ကို လည်းပြင်ဖို့လိုလာပါပြီ။ အဲဒီတော့ ဒီလို ပြင်လိုက်ပါတယ်။

#import "SimpleCar.h"

@implementation SimpleCar

@synthesize make, model, vin;

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel {

[self setMake:newMake];

[self setModel:newModel];

}

@end

SimpleCar.h မှာ ကြေငြာထားတာတဲ့ Properties ကို အလုပ်လုပ်ဖို့အတွက် @synthesize နဲ့ variable တွေ ကြေငြာလိုက်ပါတယ်။ ဒါကြောင့် setMake, setModel စတာတွေကို သုံးလို့ရတာပေါ့။

အခုဆိုရင်တော့ Objective-C အကြောင်း အနည်းငယ်တော့ သိလာပြီလို့ထင်ပါတယ်။ နောက်နေ့တွေမှာ ဒီထက် ပိုပြီး ပျော်စရာကောင်းတဲ့ code တွေနဲ့ ရှေ့ဆက်သွားပါအုံးမယ်ဗျာ။

reference: http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-4/