ပြီးခဲ့တဲ့ အပိုင်းတွေကတော့ အခြေခံလေးတွေကို ပြန်နွှေးပြီးပါပြီ။ ပြီးခဲ့တဲ့ အပိုင်း တွေကတော့
- Day 1: Introduction to C Programming
- Day 2: Introduction to Objective C
- Day 3: Working With Class
- Day 4: More Work With Class
- Day 5: Memory Management
ကဲ .. အခု 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 <Foundation/Foundation.h> #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/
Thanks for sharing. Useful for those (including me) who start learn XCode.