Objective c là gì

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Các ưu nhược điểm của Swift so với Objective C

Swift và Objective-C là hai ngôn ngữ trong lập trình iOS.

Objective-C ra đời trước Swift và đã có lịch sử phát triển với rất nhiều ứng dụng.

Về sau Swift được phát triển để thay thế Objective-C. Swift cũng đi kèm với công cụ lập trình trực quan. Do đó, làm tới đâu thấy tới đó luôn, sẽ giúp ích nhiều cho các lập trình viên, đỡ tốn công debug.

Tuy nhiên Swift vẫn chưa thể thay thế ngay được Objective C.

Nếu bạn đã lập trình với cả C và Python thì bạn sẽ thấy Objective C giống C còn Swift giống Python. Swift lược bỏ đi khá nhiều những cú pháp phức tạp và rắc rối.

  Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift

  Arguments object trong javascript là gì? Cách sử dụng?

  • Swift chạy nhanh hơn, tương đương với C++
  • Swift dễ đọc và dễ học hơn so với Objective-C [cú pháp hoàn toàn mới, ngắn gọn hơn rất nhiều]
  • Các file trong Swift thống nhất neenvieecj bảo trì code đơn giản hơn.
  • Compiler của Swift tốt hơn Objective C
  • Swift không sử dụng con trỏ giúp cho code an toàn hơn, và giúp lập trình viên lược bỏ phần khái niệm khó nhằn về con trỏ.
  • Swift quản lý bộ nhớ tốt hơn
  • Swift là mã nguồn mở: Lập trình viên có thể xem được mã nguồn, chỉnh sửa, vá lỗi.
  • Nhiều API không làm việc với Swift
  • Nhiều qui tắc khi khởi tạo, lựa chọn kiểu optional
  • Một lượng lớn các project, phần mềm trước đó đều viết bằng Objective C do đó Objective C.

Tóm tại, tuy tồn tại một số nhược điểm nhưng Swift vượt trội hoàn toàn so với Objective C. Trường hợp các dự án cũ, nhỏ thì bạn hoàn toàn có thể kết hợp cả 2 ngôn ngữ này.

Bài viết gốc được đăng tải tại codecute.com

Có thể bạn quan tâm:

Xem thêm Việc làm swift, tuyển dụng it hấp dẫn trên TopDev

Swift là gì?

Chính thức được Apple giới thiệu tại hội nghị WWDC 2014, Swift là ngôn ngữ lập trình hoàn toàn mới, được phát triển với định hướng sẽ thay thế cho bậc tiền bối của mình - Objective-C. Đến nay, sau 2 năm ra mắt, Apple đã chính thức đưa ngôn ngữ đầy tiềm năng này trở thành ngôn ngữ mã nguồn mở, tạo nhiều thuận lợi hơn cho các lập trình viên iOS.

Dễ nhận thấy, tuy Swift là một ngôn ngữ mới nhưng lại có nhiều ưu điểm vượt trội hơn, đặc biệt ở khoản nhanh, đơn giản và hiệu năng xử lý tốt hơn so với Objective-C rất nhiều. Và một điểm mạnh không thể nhắc tới đó là tính năng Xcode Playgrounds, giúp các lập trình viên [LTV] có thể xem nhanh kết quả ở màn hình kế bên theo thời gian thực, giúp đẩy nhanh quá trình tạo ra ứng dụng. 

Swift và Objective-C – Chọn bên nào, bỏ bên nào?

Theo Ông Craig Federighi - phó chủ tịch kĩ thuật phần mềm Apple cho biết "Chúng tôi nghĩ Swift là một ngôn ngữ lập trình lớn kế tiếp, thứ sẽ được tất cả chúng ta dùng để phát triển ứng dụng và cả lập trình hệ thống trong vòng 20 năm tới. Chúng tôi nghĩ rằng Swift nên có mặt ở mọi nơi và cho mọi người".
 


Vậy với định hướng này, các lập trình viên iOS tương lai nên chọn hướng tiếp cận nào [học Objective-C hay Swift hay cả 2] mới là phù hợp? Thật không thể phủ nhận những ưu thế nổi trội của Swift, tuy nhiên với tuổi đời còn khá trẻ nên cần nhiều thời gian để phát triển cộng đồng, do đó, khoảng thời gian để Swift có thể thay thế hoàn toàn Objective-C sẽ còn mất một thời gian dài.

Ngoài ra, phần lớn các ứng dụng iOS trong nước hiện nay đều viết bằng ngôn ngữ Objective-C và các LTV còn phải tiếp tục duy trì và cải tiến các ứng dụng đó. Trong khi chỉ số ít công ty sử dụng Swift cho một vài dự án, vậy thì gần như các công việc trong lĩnh vực lập trình iOS hiện nay đều dành cho các LTV sử dụng thành thạo ngôn ngữ Objective-C. Và đương nhiên, nhu cầu tuyển dụng LTV iOS thành thạo Objective-C vẫn chiếm đa số.

Thiết nghĩ, để có sự chuẩn bị tốt nhất, các LTV iOS tương lai nên tiếp cận Objective-C trước và bổ sung thêm kiến thức Swift. Việc này giúp tạo lợi thế trong công việc và khi ứng tuyển, ngoài ra, vững cả 2 ngôn ngữ này giúp cho các LTV đáp ứng được nhu cầu thị trường hiện tại và sẵn sàng khi thời đại của ngôn ngữ Swift lên ngôi.

[Tham khảo: 9to5mac.com, makeuseof.com, skilledup.com,...]

Bạn có biết?

Hiện nay có 2 hình thức học Swift phổ biến:

1. Tự học qua các nguồn tài nguyên có sẵn, cách này đòi hỏi cao tính tự giác, chủ động. Xem các nguồn tài nguyên tự học tại đây.

2. Tham gia khóa học Lập trình iOS với Swift của Trung tâm Tin học - Đại học Khoa học Tự Nhiên TP.HCM

Khai giảng: Thường xuyên
Học phí:  3.500.000đ/khóa
Thời lượng:  60 giờ/khóa
Nội dung khóa học: Xem thêm tại đây

-[BOOL]writeToFile:[NSString *]path atomically:[BOOL]useAuxiliaryFile;

-[kiểu dữ liệu]tên hàm:[kiểu dữ liệu]tham số 1 :[kiểu dữ liệu]tham số 2;

Như đã nói, Obj-C có cách gọi phương thức [gọi hàm] của ngôn ngữ Smalltalk] cho nên trông nó khác hẳn C,C++ hay Java. Để đơn giản bạn đối chiếu hai ngôn ngữ Java và Obj-C

//Java

displayNames[];

displayNamesWithPrefix[ prefix ];

addressBook.displayNames[];

addressBook.displayNamesWithPrefix[ prefix ];

//Obj-C

[addressBook displayNames];

[addressBook displayNamesWithPrefix: prefix];

Tức là cú pháp

[object method];

[object methodWithInput: inputValue];

đối với hàm trả về giá trị thì..

names = [addressBook names];

names = [addressBook namesWithPrefix:prefix];

Khởi tạo đối tượng:

Đây là một lớp dữ liệu trường đc sử dụng trong các chương trình obj-C, nó tương tự kiểu chuỗi trong các ngôn ngữ C++,Java, PHP…

ví dụ: NSString *blogname = @”Xcode Blog chấm com”;

Khởi tạo đối tượng

Trong C++, Java khái niệm này trương tự “Constructor”. Nghĩ là cấp phát mới vùng nhớ cho đối tượng và init các thuộc tính của đối tượng đó.

NSString* myString = [NSString string];

Obj-C chia làm hai loại khởi tạo:

Autorelase: đối tượng được khởi tạo dạng này thì bộ nhớ của chúng sẽ được quản lý 1 tự động. Tức là hệ thống sẽ tự thu hồi vùng nhớ của đối tượng khi nó không được dùng nữa.

ví dụ:

NSString* myString = [NSString string];

Manualrelase: Các biến này cần phải được quản vùng nhớ bởi “chính bạn”. Tức là phải gọi hàm destroy [trong Obj-C nó là hàm release] khi mà đối tượng không còn được dùng nữa.

ví dụ:

NSString* myString = [[NSString alloc] init];

Xây dựng lớp: Declaring a Class

Thông thường trong Obj-C class được xây dựng trên 2 file .h [header file] và .m [implement file]. Header file chứa phần interface của class, implement file chứa phần implementation của các phương thức.

Tên file đặt theo tên class ví dụ lớp “ClassName” sẽ có 2 file ClassName.h và ClassName.m

Class interface

xem ví dụ:

#import

@interface Photo : NSObject {

id caption;

id photographer;

}

@end

Line #1: giống với included của C, C++ hay import của Java

Line #2: Khai báo lớp Photo, thừa kế từ lớp NSObject. [NSObject là lớp “tổ tiên” trong Obj-C mọi lớp khác đều thừa kế từ nó].

Line  #3,#4: khai báo 2 đối tượng con trỏ kiểu “id” [id là từ khóa, con trỏ có thể trỏ đến mọi đối tượng].

Khai báo phương thức:

Có hai loại phương thức:

Phương thức lớp [Class Method]: phương thức này được gọi thông qua tên lớp được khai báo với dấu +

+ [kiểu dữ liệu]tên phương thức :[kiểu dữ liệu] tên tham số thứ nhất...

Phương thức đối tượng: được gọi qua tên đối tượng

- [kiểu dữ liệu]tên phương thức :[kiểu dữ liệu] tên tham số thứ nhất...


#import

@interface Photo : NSObject {

NSString* caption;

NSString* photographer;

}

- [NSString*] caption;

- [NSString*] photographer;

- [void] setCaption: [NSString*]input;

- [void] setPhotographer: [NSString*]input;

@end

Cài đặt/hiện thực lớp : Implement Class

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#import "Photo.h"

@implementation Photo

- [NSString*] caption {

return caption;

}

- [NSString*] photographer {

return photographer;

}

- [void] setCaption: [NSString*]input {

[caption autorelease];

[input retain];

caption = input;

}

- [void] setPhotographer: [NSString*]input {

[photographer autorelease];

[input retain];

photographer = input;

}

@end

Quản lý bộ nhớ : Memory Management

Mình chỉ xét đến trường hợp project/file ở dạng nonARC thôi nhé, tức là những phương thức quản lý này chỉ áp dụng cho project hoặc file không hỗ trợ ARC [Automatic Reference Counting] thôi. Khi nào viết bài về ARC mình sẽ nói về cách quản lý vùng nhớ của các project file dạng đó.

Release

Cơ bản nhất của quản lý bộ nhớ là: biến nào mà bạn khởi tạo bằng method aloc thì khi nào kô dùng biến đó nữa bạn phải gọi hàm release.

ví dụ:

NSString *stringA = [[NSString alloc] initWithString:@"//xcodeblog.com"];

NSString *stringB = [NSString string];

//bạn phải release stringA

[stringA release];

Nếu bạn copy 1 đối tượng thì đối tượng copy phải đc relase khi không dùng đến nữa.

NSString *stringA = [[NSString alloc] initWithString:@"//xcodeblog.com"];

NSString *stringB = [stringA copy];

//bạn phải release stringA và stringB

[stringA release];

[stringB release];

Retain

Obj-C sử dụng một biết đếm “retainCount” để quản lý các tham chiếu đến chính đối tượng đó. Các phương thức alloc, new, copy sẽ tăng biến này lên 1, phương thức release sẽ giảm xuống 1.

Khi retainCount của đối tượng có giá trị là 0 lúc đó đối tượng sẽ bị dealloc [tự hủy]. Do đó khi đối tượng được dùng trong một phương thức của đối tượng khác chúng ta cần gọi retain để tăng retain count của đối tượng lên 1 dĩ nhiên phải giảm nó 1 khi không dùng nữa.

Ý nghĩa của retain là đảm bảo cho đối tượng đc retain không bị hủy trong khi nó đang bị trưng dụng bởi đối tường khác.

- [void] setTotalAmount: [NSNumber*]input {

[totalAmount autorelease];

totalAmount = [input retain];

}

Dealloc

Đây là phương thức hủy của đối tượng, bạn  phải gọi release các đối tượng khác mà đối tườn của bạn đang dùng.

Property và các option

Đây là 1 đặc tính của Obj-C cho phép tự động tạo ra các phương thúc setter và getter

ví dụ thay vì định nghĩa lớp như code sau đây

#import

@interface Photo : NSObject {

NSString* caption;

NSString* photographer;

}

+ [Photo*] photo;

- [NSString*] caption;

- [NSString*] photographer;

- [void] setCaption: [NSString*]input;

- [void] setPhotographer: [NSString*]input;

@end

ta có thể dùng code sau

#import

@interface Photo : NSObject {

NSString* caption;

NSString* photographer;

}

+ [Photo*] photo;

@property [retain] NSString* caption; @property [retain] NSString* photographer;

@end

Các Options

readwrite[mặc định]: cho phép đọc và ghi[get/set]
read-only: chỉ có thể đọc [get]
assign[mặc định] dùng với các kiểu vô hướng: NSString, NSInteger, CGFloat…
retain: thường được sử dụng cho đối tượng
copy: tạo một bản sao lưu của đối tượng
attomic [mặc định] thực hiện đồng bộ hoá
nonattomic: ngược lại với attomic

Category

Objective-C không có đa thừa kế như Java nghĩa là bạn không thể tạo 1 lớp mới thừa kế 1 lúc nhiều lớp khác. Nhưng bạn có thể mở rộng một lớp nào đó bất kỳ. Khái niệm này là Category, bạn có thể thêm vào 1 lớp nào đó các phương thức, biến..

@interface NSString [Utilities]

- [BOOL] isXcodeBlogUrl;

@end

@implementation NSString [Utilities]

- [BOOL] isURL {

if [ [self hasPrefix:@"//xcodeblog.com"] ]

return YES;

else

return NO;

}

Protocol

Đây là một đặc điểm tuyệt vời của Objectice-C,  cho phép các lớp/đối tượng khác biệt [không thừa kế] nhau có thể sử dụng phương thức ủa nhau mà không cần phải thừa kế

Đây là một ví dụ trong đó mình sử dụng pro tocol của lớp UITableView trong lớp UIViewController :

Load json feed lên UITableView sử dụng AFNetworking

Khái niệm này nói thì khó và dài dòng nhưng, sử dụng thì rất dễ và hiệu quả. Ý nghĩa của nó là cho phép bạn implement các phương thức của một lớp [phương thức này thuộc protocol] trong phần implement của một lớp khác.

@protocol IconViewInfo

- [NSString*] title;

- [NSString*] fileName; - [NSString*] summary;

@optional

- [NSString*] author;

- [id] previewData; @end

Từ khóa @optional [ mặc định] nghĩa là cái protocol methods này không bawtsc buộc phải implement trong lớp “thừa kế” protocol.

@interface Photo : Media

@property [copy] NSString* caption;

@property [copy] NSString* photographer;

@end

Các methods của protocol IconViewInfo sẽ đc implement trong phần thân của class Photo

@implementation Photo

@synthesize caption; @synthesize photographer;

-[NSString *] title {

return self.caption; }

-[NSString *] fileName {

return [self.caption stringByAppendingPathExtension:@"jpg"]; }

-[NSString *] summary {

return [NSString stringWithFormat:

}

} @end

Mình sẽ nói rõ hơn khi gặp vấn đề liên quan, chú ý rằng đây là một đặc điểm dùng nhiều trong ứng dụng iOS/Mac OS nên bạn “phải” hiểu nó.

Thông điệp động Dynamic Message

Như đã nói Obj-C là ngôn ngữ động – mềm mại – uyển chuyển. Và đây là đặc điểm đó, Obj-C bạn có thể lưu giữ tên hàm như 1 biến và truyền chúng giữa các đối tượng khác nhau :D. Phương thức này là “selector” và kiểu dữ liệu của nó là “SEL”

SEL homeSelector = @selector[ loadHomeScreen: ];

NSString* selectorName = @"loadPreviewScreen:";

SEL previewSelector = NSSelectorFromString[ selectorName ];

//multiple inputs

SEL compareSelector = @selector[compare:options:range:];

ví dụ về cách sử dụng

@interface Photo : NSObject

- [NSString*] caption;

- [void] setAlbum:[Album*]album;

@end

@interface Album : NSObject + [id] defaultAlbum;

@end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Photo* myPhoto = [[Photo alloc] init]; Album* myAlbum = [[Album alloc] init];

SEL captionSelector = @selector[ caption ];

SEL albumSelector = @selector[ setAlbum: ];

SEL unknownSelector = @selector[ yeahThisMethodDoesntActuallyExist ];

if [[myPhoto respondsToSelector: captionSelector]] {

NSLog [@"Calling '%@'", NSStringFromSelector[ captionSelector ]];

NSString* caption = [myPhoto performSelector:captionSelector];

NSLog [@"Photo caption: '%@'", caption];

}

if [[myPhoto respondsToSelector: albumSelector]] {

NSLog [@"Calling '%@'", NSStringFromSelector[ albumSelector ]];

[myPhoto performSelector:albumSelector withObject:myAlbum]; }

if [[myPhoto respondsToSelector: unknownSelector]] {

NSLog [@"Calling '%@'", NSStringFromSelector[ unknownSelector ]];

[myPhoto performSelector:unknownSelector];

}

[myPhoto release]; [myAlbum release];

Ngoại Lệ : Exceptions

Tương tự C++ hay  Java bạn chỉ cần xem qua ví dụ là hiểu

1

2

3

4

5

6

7

8

9

10

11

12

13

14

NSString* myString = [[NSString alloc] init];

@try {

char firstChar = [myString characterAtIndex:0]; int length = [myString length];

NSLog[ @"Length is: %i", length ];

}

@catch [NSException * e] {

NSLog[ @"Caught an NSException, returning." ]; NSLog[ @"Name: %@", e.name ];

NSLog[ @"Reason: %@", e.reason ];

return;

}

@finally {

// will still get called, even if above returns. NSLog[ @"Releasing string."];

[myString release];

}

Video liên quan

Chủ Đề