Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5
  1. #1
    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;
    => Cách sử dụng enum trong lập trình C Object

    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
    File thực thi.
    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
    * Đặc điểm:
    - 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
    MyClass.m

    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
    File chính:

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

  2. #2
    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

  3. #3
    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
    Fraction.h

    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
    Fraction.m

    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
    Complex.h

    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
    Complex.m

    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
    main.m

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

  4. #4
    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

  5. #5
    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.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •