Chủ đề: Khái niệm cơ bản về Object C
-
14-01-2013, 04:50 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Khái niệm cơ bản về Object C
I. Thông tin chung:
- Lập trình IOS cần phải biết về ngôn ngữ C Object. Vì C Object là ngôn ngữ chính của Apple trong việc phát triển các chương trình trong Mac OS (IOS lẫn Mac OS). Đây là ngôn ngữ chính thức để lập trình với Apple.
- Dĩ nhiên bạn có thể dùng các ngôn ngữ khác để lập trình;
+ PHP: Ngôn ngữ đánh dấu văn bản có thể được sử dụng để viết chương trình với IOS nhưng nó có những hạn chế riêng
+ C# với Mono Touch, bạn có thể chuyển ngôn ngữ sang để lập trình với IOS nhưng nó không phải là chính thức mà thông qua một hãng thứ ba (không phải là Apple cho chính thức phát hành).
+ Lua (ngôn ngữ lập trình Script) với Codea lập trình hoàn toàn trên Ipad. Có một số dự án đã hoàn thành như (Cargo Bot, ...) tiện lợi nhưng không trực quan, và cách để có được chương trình trên Apple tương đối phức tạp (Export).
+ Ngoài ra vẫn có thể sử dụng C và C++ để lập trình Iphone
+ Java cũng có thể lập trình Iphone được
+ Một số ngôn ngữ khác nhưng tôi không biết
=> C Object vẫn là ưu tiên hàng đầu khi lập trình Iphone/Ipad vì đây là ngôn ngữ chính được hỗ trợ bởi chính Apple
=> Object C không hể dựa trên C++ như nhiều người lầm tưởng vì chúng ra đời trong cùng một năm (1983)
II. Nội dung chính:
Tuy là học về Object C nhưng sự khác nhau về mục đích sẽ làm cách học khác nhau ví dụ bạn học Object C để viết phần mềm cho Mac nó khác khi viết cho IOS. Sự phát triển của các công cụ hỗ trợ IDE rất nhanh, có những thứ thật sự bạn không cần phải quan tâm nữa.
Đối với các lập trình viên C, việc quản lý bộ nhớ là vô cùng quan trọng, bộ nhớ của các thiết bị di động lúc trước là rất nhỏ, tiết kiệm được chút bộ nhớ sẽ làm chương trình chạy mượt mà hơn. Tuy nhiên hiện tại thì việc đó không còn cần thiết nữa do IDE mới đã tích hợp bộ ARC (Automatic Reference Control) giúp cho các lập trình viên không cần phải quan tâm nhiều đến việc quản lý bộ nhớ. ARC đã loại bỏ hẳn việc release bộ nhớ.
Như vậy bạn phải hiểu rằng, công nghệ thông tin có những thay đổi vượt bậc và việc làm theo những cách cũ hay hiểu biết những thứ như vậy chả giúp ích gì cho việc lập trình nó chỉ làm cho bạn vất vả thêm, chương trình ra chậm hơn.
1. Đặc điểm cơ bản:
- Là ngôn ngữ hướng đối tượng
- Mở rộng từ C
- Nhẹ nhàng (không sử dụng VM – không quá thực tạp với friend virtuals với template với….)
- Mềm dẻo (mở rộng từ C nên bạn có thể dùng C thuần cấu trúc ngoài ra đây là ngôn ngữ run-time)
- Reflection (có hỗ trợ)
- nil thay thế cho NULL trong C, bởi vì bạn có thể gửi thông điệp cho nil, nhưng không thể làm như vậy với NULL.
- BOOL có 2 giá trị là YES và NO chứ không phải là true và false nữa.
- Khái niệm methods và message đc sử dụng mang ý nghĩa như nhau đối với ObC theo đó message có những thuộc tính đặc biệt. Mọto message có thể chuyền động từ obj tới một obj khác. Việc gọi thông điệp trên một obj không có nghĩa là obj đó sẽ thực hiện message nó có thể chuyển tiếp tới một obj khác chưa biết trước tóm lại có khả năng đáp trả thông điệp không trực tiệp thì gián tiếp.
Khi làm việc với Objective C bạn cần chú ý là bởi vì nó đượcc base trên nền của C cho nên việc bạn sử dụng cú pháp C chộn lẫn với cú pháp chính thống của Objective C là hoàn toàn chấp nhận, tuy nhìn có vẻ hơi củ chuối.
Phương thức:
1. Enum trong lập trình C Object
Mã:typedef enum { Monday=1, ... } WORKDAYS; WORKDAYS today = Monday;
2. Cách khai báo phương thức trong Objective C
Không tham số :
<(kiểu trả về)> Tên phương thức
Ví dụ -(void) print;
Có tham số:
<(kiểu trả về)> Tên_phương_thức :<(kiểu)> Tên_Biến :<(kiểu)> Tên_Biến;
* Ví dụ: -(void) setDenominator: (int) d;
Lời gọi phương thức:
không trả về: [<đối tượng> ];
[<đối tượng> :<(kiểu)> ];
[<đối tượng> :<(kiểu)> :<(kiểu)> ];
Trả về kết quả: = [<đối tượng> ];
= [<đối tượng> :<(kiểu)> :<(kiểu)> ];
3.Categories:
Là đặc điểm nếu bạn muốn mở rộng lớp bằng cách thêm mới vào lớp một phương thức. Khi bạn làm việc quen với OOP thì bạn sẽ thấy đây là một trong những thuộc tính vô cùng hữu ích của Objective C, kể cả ngay khi bạn không có mã nguồn của lớp nhưng bạn vẫn hoàn toàn có thể thêm phương thức cho lớp như thường thông qua thuộc tính này. Đặc điểm này làm giảm đi đáng kể sự kế thừa phức tạp trong C++ khi việc kế thừa chỉ để phục vụ cho việc thêm mới một phương thức. Mặt khăc việc chia mã nguồn trên nhiều files cũng giúp ích đáng kể trong việc phát triển.
Mã:#import “Fraction.h” @interface Fraction (Math) -(Fraction*) add: (Fraction*) f; -(Fraction*) mul: (Fraction*) f; -(Fraction*) div: (Fraction*) f; -(Fraction*) sub: (Fraction*) f; @end
Mã:#import “FractionMath.h” @implementation Fraction (Math) -(Fraction*) add: (Fraction*) f { return [[Fraction alloc] initWithNumerator: numerator * [f denominator] + denominator * [f numerator] denominator: denominator * [f denominator]]; } -(Fraction*) mul: (Fraction*) f { return [[Fraction alloc] initWithNumerator: numerator * [f numerator] denominator: denominator * [f denominator]]; } -(Fraction*) div: (Fraction*) f { return [[Fraction alloc] initWithNumerator: numerator * [f denominator] denominator: denominator * [f numerator]]; } -(Fraction*) sub: (Fraction*) f { return [[Fraction alloc] initWithNumerator: numerator * [f denominator] - denominator * [f numerator] denominator: denominator * [f denominator]]; } @end
- Tên của category phải là duy nhất
- Có thể thêm bao nhiêu lần mở rộng lớp từ category là không giới hạn nhưng với tên là duy nhất.
- Thông thể bổ xung biến thành phần bằng category.
- Có thể sử dụng category để tạo ra các phương thức private. Nếu cần.
MyClass.h
Mã:#import @interface My; @end
Mã:#import “MyClass.h” #import @implementation MyClass -(void) publicMethod { printf( “public method ” ); } @end
Mã:@interface MyClass (Private) -(void) privateMethod; @end @implementation MyClass (Private) -(void) privateMethod { printf( “private method ” ); } @end
Mã:#import “MyClass.h” int main( int argc, const char *argv[] ) { MyClass *obj = [[MyClass alloc] init]; // this compiles [obj publicMethod]; // this throws errors when compiling //[obj privateMethod]; // free memory [obj release]; return 0; }
View more random threads:
- [help] số nguyên tố
- Có hay không sự sa sút của Apple?
- đồ họa trong C
- Hỏi về cơ chế quản lý heap trên 1 vùng nhớ tĩnh được cấp phát trước
- Socket trên Objective c
- A/c giỏi c++ giúp giùm e mấy bài này với.
- Đánh giá cách thiết kế nội thất nhà ở xã hội
- mấy anh coi dùm em bài tập này ạ, cảm ơn mấy anh nhiều
- không dùng được "sqrt"?
- Thread trong objective c
-
15-01-2013, 03:16 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hay đấy bác. Nếu có thời gian bác tổng hợp lại về phần protocol, delegate (chú trọng vào cái này cái [IMG]images/smilies/biggrin.png[/IMG] )..., đã có mấy bài viết nhưng nhiều trả lời quá, ko tập trung. Bác rành thì viết kỹ về cái này chút để a e chỉ cần đọc bài của bác là có thể nắm vững mấy cái này, nhất là cái delegate ấy bác
-
15-01-2013, 05:31 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
4. Protocols: Giao diện.
Đây hoàn toàn tương đồng với khái miện lớp ảo trong C++ hoặc gọi là giao diện trong C# và Java. Bản thân @protocals không có sự thực thi. Nếu lớp nào cam kết thực thi nó thì trong phần thực thi sẽ implement các phương thức mà protocols khai báo.
Mã:@protocol Printing -(void) print; @end
Mã:#import #import “Printing.h” @interface Fraction: NSObject { int numerator; int denominator; } -(Fraction*) initWithNumerator: (int) n denominator: (int) d; -(void) setNumerator: (int) d; -(void) setDeno minator: (int) d; -(void) setNumerator: (int) n andDenominator: (int) d; -(int) numerator; -(int) denominator; @end
Mã:#import “Fraction.h” #import @implementation Fraction -(Fraction*) initWithNumerator: (int) n denominator: (int) d { self = [super init]; if ( self ) { [self setNumerator: n andDenominator: d]; } return self; } -(void) print { printf( “%i/%i”, numerator, denominator ); } -(void) setNumerator: (int) n { numerator = n; } -(void) setDenominator: (int) d { denominator = d; } -(void) setNumerator: (int) n andDenominator: (int) d { numerator = n; denominator = d; } -(int) denominator { return denominator; } -(int) numerator { return numerator; } -(Fraction*) copyWithZone: (NSZone*) zone { return [[Fraction allocWithZone: zone] initWithNumerator: numerator denominator: denominator]; } @end
Mã:#import #import “Printing.h” @interface Complex: NSObject { double real; double imaginary; } -(Complex*) initWithReal: (double) r andImaginary: (double) i; -(void) setReal: (double) r; -(void) setImaginary: (double) i; -(void) setReal: (double) r andImaginary: (double) i; -(double) real; -(double) imaginary; @end
Mã:#import “Complex.h” #import @implementation Complex -(Complex*) initWithReal: (double) r andImaginary: (double) i { self = [super init]; if ( self ) { [self setReal: r andImaginary: i]; } return self; } -(void) setReal: (double) r { real = r; } -(void) setImaginary: (double) i { imaginary = i; } -(void) setReal: (double) r andImaginary: (double) i { real = r; imaginary = i; } -(double) real { return real; } -(double) imaginary { return imaginary; } -(void) print { printf( “%_f + %_fi”, real, imaginary ); } @end
Mã:#import #import “Fraction.h” #import “Complex.h” int main( int argc, const char *argv[] ) { // create a new instance Fraction *frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10]; Complex *comp = [[Complex alloc] initWithReal: 5 andImaginary: 15]; id printable; id copyPrintable; // print it printable = frac; printf( “The fraction is: ” ); [printable print]; printf( “ ” ); // print complex printable = comp; printf( “The complex number is: ” ); [printable print]; printf( “ ” ); // this compiles because Fraction comforms to both Printing and NSCopyable copyPrintable = frac; // this doesn’t compile because Complex only conforms to Printing //copyPrintable = comp; // test conformance // true if ( [frac conformsToProtocol: @protocol( NSCopying )] == YES ) { printf( “Fraction conforms to NSCopying ” ); } // false if ( [comp conformsToProtocol: @protocol( NSCopying )] == YES ) { printf( “Complex conforms to NSCopying ” ); } // free memory [frac release]; [comp release]; return 0; }
-
09-04-2013, 04:31 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hey bác Huygamer,
Em giờ mới bắt đầu có điều kiện để nghịch trở lại iOS, từ cơ bản.
Hum nay đọc lại bài của bác thì có một điểm thắc mắc như thế này, đó là về ARC trong xCode, thấy bài bác viết thì ARC là viết tắt của Automatic Release Control, nhưng theo trang chủ của Apple thì nó phải là Automatic Reference Counting. Như vậy là thuật ngữ bác viết chưa chính xác hay là em tìm sai nhỉ
Đây là link đến công cụ mới này
http://developer.apple.com/library/i...xcode_4_2.html
-
09-04-2013, 05:46 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Thuật ngữ đúng là Automatic Reference Counting như bạn nói.
Tui viết lộn, sorry.
Với sự đa dạng và phong phú về mẫu mã và giá cả, choxeonline.vn hứa hẹn sẽ là địa chỉ tin cậy cho những ai đang tìm kiếm chiếc xe ô tô ưng ý. Từ những mẫu xe hạng sang đến những chiếc xe gia đình...
Khám Phá Đa Dạng Sản Phẩm Xe Ô Tô...