30 câu hỏi và câu trả lời phỏng vấn Objective-C hàng đầu (2026)

Câu hỏi và câu trả lời phỏng vấn về Objective-C

Chuẩn bị cho một vị trí lập trình Objective-C nghĩa là phải dự đoán được những câu hỏi mà nhà tuyển dụng sẽ đặt ra, ngoài cú pháp và mô hình bộ nhớ. Một cuộc phỏng vấn Objective-C sẽ bộc lộ chiều sâu lập luận, khả năng đánh giá thiết kế và hiểu biết thực tiễn thông qua các câu hỏi có trọng tâm một cách nhất quán.

Những câu hỏi này mở ra con đường cho các kỹ sư mới ra trường, kỹ sư trung cấp và kỹ sư cao cấp, phản ánh xu hướng ngành và khả năng thực hiện công việc thực tế. Nhà tuyển dụng đánh giá cao chuyên môn kỹ thuật, khả năng phân tích và xác định vấn đề từ các chuyên gia có kinh nghiệm thực tế, cộng tác với trưởng nhóm và quản lý để áp dụng kỹ năng Objective-C trong môi trường sản xuất. Quan điểm này hỗ trợ sự phát triển ở nhiều giai đoạn khác nhau trong sự nghiệp.
Đọc thêm ...

👉 Tải xuống PDF miễn phí: Câu hỏi và đáp án phỏng vấn Objective-C

Các câu hỏi và câu trả lời phỏng vấn Objective-C hàng đầu

1) Objective-C là gì và tại sao nó được sử dụng?

Objective-C là một tập hợp con nghiêm ngặt của ngôn ngữ lập trình C Ngôn ngữ này bổ sung thêm khả năng lập trình hướng đối tượng và môi trường thực thi động. Nó được phát triển lần đầu vào đầu những năm 1980 và là ngôn ngữ chính được sử dụng cho... macOS và phát triển ứng dụng iOS trước đây SwiftNó kế thừa cú pháp từ C nhưng sử dụng kiểu nhắn tin cho đối tượng theo phong cách Smalltalk, cho phép gọi các phương thức một cách động trong thời gian chạy.

Objective-C được sử dụng để phát triển ứng dụng gốc trên nền tảng của Apple vì nó tích hợp chặt chẽ với các framework của Apple như Foundation và Cocoa/Cocoa Touch. Điều này cho phép các nhà phát triển xây dựng ứng dụng với quyền truy cập đầy đủ vào các API hệ thống và các thành phần giao diện người dùng phong phú.

Ví dụ:

#import <Foundation/Foundation.h>
@interface Sample : NSObject
- (void)showMessage;
@end

@implementation Sample
- (void)showMessage {
    NSLog(@"Hello from Objective-C!");
}
@end
int main() {
    Sample *obj = [[Sample alloc] init];
    [obj showMessage];
    return 0;
}

2) Hãy giải thích cấu trúc cơ bản của một chương trình Objective-C.

Một chương trình Objective-C thường bao gồm:

  1. Lệnh tiền xử lý (Chẳng hạn như #import)
  2. Giao thức (@interface) – định nghĩa lớp và các phương thức/thuộc tính công khai của nó
  3. Triển khai hệ thống (@implementation) – chứa các định nghĩa phương thức
  4. Phương pháp – các chức năng liên quan đến đối tượng
  5. BiếnBiểu đạt & Câu nói – logic mã
  6. Nhận xét để mô tả logic của mã

Cấu trúc này tách biệt rõ ràng giao diện khỏi phần triển khai, giúp phân chia mã thành các module.


3) Giao thức trong Objective-C là gì và có những loại giao thức nào?

Trong Objective-C, một giao thức Nó tương tự như một giao diện trong các ngôn ngữ lập trình khác. Nó định nghĩa một tập hợp các phương thức mà bất kỳ lớp nào cũng có thể kế thừa và triển khai, cho phép kế thừa đa cấp các chữ ký phương thức (không phải triển khai).

Có hai loại:

  • Các quy trình chính thức – Được khai báo bằng cách sử dụng @protocol; có thể định nghĩa cần phảikhông bắt buộc phương pháp.
  • Các giao thức không chính thức – Thường được triển khai dưới dạng các danh mục trên NSObject; tùy chọn theo thiết kế.

Ca sử dụng: Các mô hình ủy quyền trong UIKit thường sử dụng các giao thức (ví dụ: UITableViewDelegate).


4) Sự khác biệt giữa #import và #include là gì?

  • #include là chỉ thị tiền xử lý C dùng để chèn nội dung của một tệp vào tệp khác, điều này có thể gây ra vấn đề bao hàm nhiều.
  • #import là một chỉ thị Objective-C đảm bảo rằng một tệp chỉ được bao gồm. hàng loạt, tránh trùng lặp.

Do đó, #import Phương pháp này an toàn hơn và được ưa chuộng hơn trong quá trình phát triển Objective-C.


5) Các loại phân loại (categories) có tác dụng gì trong Objective-C?

Các danh mục mở rộng một lớp hiện có bằng cách thêm phương thức mà không cần kế thừa lớp con hoặc sửa đổi mã gốc. Chúng cho phép bạn phân tách các phương thức một cách hợp lý thành các nhóm hoặc thêm hành vi bổ sung cho các lớp khung như... NSString.

Ví dụ sử dụng: Thêm các phương thức tiện ích vào NSArray không cần kế thừa lớp con:

@interface NSArray (Utility)
- (NSArray *)reversedArray;
@end

6) @synthesize làm gì?

@synthesize Chỉ thị này yêu cầu trình biên dịch thực hiện các bước sau: tạo các phương thức getter và setter đối với tài sản được khai báo với @propertyĐiều này đảm bảo tính đóng gói và tự động hóa mã lặp lại.

từ Xcode 4.4, tự tổng hợp là mặc định — bạn thường không cần phải viết @synthesize một cách rõ ràng.


7) Giải thích về quản lý bộ nhớ trong Objective-C.

Objective-C sử dụng Đếm tham chiếu tự động (ARC) Để quản lý bộ nhớ, ARC bổ sung các lệnh retain/release do trình biên dịch tạo ra, đảm bảo các đối tượng vẫn tồn tại miễn là cần thiết và được Giải phóng bộ nhớ khi không còn tham chiếu nào nữa..

Ý chính:

  • Nguồn tham khảo tốt giữ cho các vật thể sống
  • Tài liệu tham khảo yếu Không giữ lại các đối tượng, tránh các chu kỳ giữ.

Ví dụ:

@property (strong, nonatomic) NSString *name;
@property (weak, nonatomic) id delegate;

8) Sự khác biệt giữa NSArray và NSMutableArray là gì?

  • Mảng NS: Mảng bất biến — nội dung không thể thay đổi sau khi tạo.
  • Mảng NSMutable: Mảng có thể thay đổi — cho phép thêm, xóa hoặc thay thế các phần tử.

Ví dụ:

NSMutableArray *list = [NSMutableArray arrayWithObjects:@"A", @"B", nil];
[list addObject:@"C"]; // Allowed

9) Khái niệm đóng gói dữ liệu trong Objective-C là gì?

Đóng gói dữ liệu liên kết dữ liệu và các hàm hoạt động trên dữ liệu đó lại với nhau thành một khối duy nhất. đơn vị (lớp) đồng thời hạn chế truy cập trực tiếp từ bên ngoài lớp. Điều này đảm bảo tính mô đun, bảo vệ dữ liệu và tính trừu tượng.


10) Cơ chế gọi phương thức hoạt động như thế nào trong Objective-C?

Objective-C sử dụng thông qua cú pháp:

[object methodName];

Ở đây, object nhận được một thông báo để gọi methodNameNếu phương thức không được giải quyết, môi trường thực thi sẽ xử lý việc chuyển tiếp hoặc ném ra một ngoại lệ. Tính linh hoạt này là một tính năng mạnh mẽ của môi trường thực thi động của Objective-C.


11) Hãy giải thích sự khác biệt giữa các thuộc tính strong, weak, assign và copy trong Objective-C.

Các thuộc tính trong Objective-C xác định cách quản lý bộ nhớ cho các tham chiếu đối tượng, và việc chọn thuộc tính chính xác là rất quan trọng đối với sự ổn định của ứng dụng. strong Thuộc tính này làm tăng số lượng tham chiếu của một đối tượng, đảm bảo đối tượng đó vẫn nằm trong bộ nhớ miễn là thuộc tính đó tồn tại. Nó thường được sử dụng cho các mối quan hệ sở hữu. weak thuộc tính không giữ lại đối tượng, tự động thiết lập tham chiếu thành nil Khi đối tượng được giải phóng, điều này giúp ngăn ngừa các chu kỳ giữ tham chiếu, đặc biệt là trong các mẫu ủy quyền.

assign Thuộc tính này được sử dụng cho các kiểu dữ liệu nguyên thủy như số nguyên và số thực. Nó không giữ lại các đối tượng và không nên được sử dụng cho các đối tượng Objective-C trong ARC. Thuộc tính copy tạo ra một copy của đối tượng được gán, điều này đặc biệt quan trọng đối với các đối tượng có thể thay đổi như NSMutableString để ngăn chặn việc sửa đổi ngoài ý muốn.

đặc tính Giữ lại đối tượng Trường hợp sử dụng
mạnh mẽ TINH THẦN TRÁCH NHIỆM
yếu Không Đại biểu
giao Không Nguyên thủy
bản sao Bản sao An toàn bất biến

12) Cơ chế hoạt động bên trong của hệ thống đếm tham chiếu tự động (ARC) như thế nào?

Cơ chế đếm tham chiếu tự động (ARC) là một hệ thống quản lý bộ nhớ được thực thi trong quá trình biên dịch, tự động chèn các lệnh retain, release và autorelease. Không giống như cơ chế thu gom rác, ARC không chạy trong thời gian thực; thay vào đó, trình biên dịch phân tích vòng đời của đối tượng và xác định nơi cần thiết các lệnh quản lý bộ nhớ. Điều này đảm bảo sử dụng bộ nhớ hiệu quả mà không cần sự can thiệp của nhà phát triển.

ARC theo dõi các tham chiếu mạnh đến các đối tượng và giải phóng chúng khi không còn tham chiếu mạnh nào nữa. Các tham chiếu yếu được tự động gán giá trị 0 khi đối tượng được giải phóng, giúp cải thiện tính an toàn của ứng dụng. ARC không quản lý Core. Foundation các đối tượng tự động, do đó các kỹ thuật kết nối như __bridge__bridge_transfer là bắt buộc.

Ví dụ, vòng lặp giữ tham chiếu vẫn có thể xảy ra nếu hai đối tượng tham chiếu mạnh lẫn nhau, điều này phải được giải quyết bằng cách sử dụng tham chiếu yếu.


13) Môi trường chạy Objective-C là gì và tại sao nó lại quan trọng?

Môi trường thực thi Objective-C là một hệ thống mạnh mẽ cho phép hành vi động trong các chương trình Objective-C. Nó cho phép các phương thức được giải quyết trong thời gian chạy thay vì thời gian biên dịch, cho phép các tính năng như phân phối phương thức động, chuyển tiếp thông báo và tự phản chiếu.

Môi trường thực thi này cho phép Objective-C xác định phương thức cần gọi chỉ khi có thông báo được gửi đi. Nếu phương thức đó không tồn tại, môi trường thực thi sẽ cung cấp nhiều cách để xử lý, chẳng hạn như chuyển tiếp thông báo đến một đối tượng khác. Điều này làm cho Objective-C trở nên rất linh hoạt và có khả năng mở rộng.

Các hàm thời gian chạy cũng cho phép các nhà phát triển kiểm tra hệ thống phân cấp lớp, thêm phương thức một cách động và hoán đổi cách triển khai phương thức, điều này thường được sử dụng trong các khung gỡ lỗi và phân tích.


14) Khối (block) trong Objective-C là gì và chúng có những lợi ích gì?

Trong Objective-C, Block là các closure đóng gói mã và biến để thực thi sau này. Chúng tương tự như biểu thức lambda trong các ngôn ngữ lập trình khác và thường được sử dụng cho các hàm gọi lại, thực thi bất đồng bộ và liệt kê.

Các khối (block) nắm bắt các biến từ phạm vi xung quanh chúng, và các biến này có thể được sửa đổi bằng cách sử dụng... __block Từ khóa. Chúng đơn giản hóa khả năng đọc hiểu mã và giảm nhu cầu sử dụng các mẫu ủy quyền trong nhiều trường hợp.

Lợi ích của việc sử dụng khối (block) bao gồm cải thiện tính cục bộ của mã, khả năng đọc hiểu tốt hơn và dễ dàng lập trình bất đồng bộ. Tuy nhiên, các nhà phát triển phải cẩn trọng với các chu kỳ giữ (retain cycle) khi sử dụng khối để nắm giữ mã một cách mạnh mẽ. self. Sử dụng __weak Việc tham chiếu bên trong các khối lệnh giúp ngăn ngừa rò rỉ bộ nhớ.


15) Sự khác biệt giữa nil và NULL trong Objective-C là gì?

Trong Objective-C, nil biểu thị con trỏ đối tượng rỗng, trong khi NULL Biểu thị con trỏ null cho các kiểu dữ liệu trong C. Mặc dù chúng thường cho ra cùng một giá trị (không), nhưng về mặt ngữ nghĩa chúng khác nhau và cần được sử dụng một cách thích hợp.

nil được sử dụng cho các đối tượng Objective-C và cho phép gửi thông báo một cách an toàn mà không làm sập ứng dụng. Khi một thông báo được gửi đến nil, nó chỉ đơn giản trả về số không hoặc nilNgược lại, việc hủy tham chiếu một NULL Con trỏ trong C dẫn đến hành vi không xác định và thường gây ra lỗi ứng dụng.

Sử dụng nil Cải thiện tính an toàn và khả năng đọc hiểu mã khi làm việc với các đối tượng Objective-C, đồng thời NULL Nên dành riêng cho các cấu trúc và con trỏ trong ngôn ngữ C.


16) Giải thích khái niệm ủy quyền trong Objective-C bằng một ví dụ.

Ủy quyền (Delegation) là một mẫu thiết kế trong Objective-C cho phép một đối tượng truyền đạt các sự kiện hoặc quyết định cho một đối tượng khác. Nó được triển khai bằng cách sử dụng các giao thức và tham chiếu yếu để tránh các vòng lặp giữ (retain cycle). Ủy quyền thúc đẩy sự kết nối lỏng lẻo và khả năng tái sử dụng.

Đối tượng ủy quyền định nghĩa một giao thức, và đối tượng được ủy quyền sẽ tiếp nhận và thực thi giao thức đó. Sau đó, đối tượng ủy quyền sẽ gọi các phương thức trên đối tượng được ủy quyền khi các sự kiện nhất định xảy ra.

Ví dụ, một bảng sẽ thông báo cho đối tượng ủy quyền của nó khi một hàng được chọn. Thiết kế này cho phép tùy chỉnh hành vi mà không cần kế thừa lớp con và được sử dụng rộng rãi trong các framework của Apple.


17) Trong Objective-C, các danh mục (categories) và phần mở rộng (extensions) khác nhau như thế nào?

Cả danh mục (category) và phần mở rộng (extension) đều cho phép các nhà phát triển thêm chức năng vào các lớp hiện có, nhưng chúng phục vụ các mục đích khác nhau. Danh mục thêm các phương thức công khai vào một lớp và thường được sử dụng để tổ chức mã hoặc thêm các phương thức tiện ích. Phần mở rộng, còn được gọi là phần mở rộng lớp, thường được khai báo trong các tệp triển khai và cho phép thêm các thuộc tính và phương thức riêng tư.

Các lớp (Categories) không thể thêm biến thể hiện (instance variables), trong khi các phần mở rộng (extensions) thì có thể. Các lớp thường được sử dụng để nâng cao các lớp khung (framework classes), trong khi các phần mở rộng được sử dụng để đóng gói và mô tả chi tiết triển khai nội bộ.

Hiểu rõ sự khác biệt sẽ giúp thiết kế lớp tốt hơn và cải thiện khả năng bảo trì.


18) Mã hóa khóa-giá trị (KVC) hoạt động như thế nào trong Objective-C?

Mã hóa khóa-giá trị (KVC) cho phép truy cập gián tiếp vào các thuộc tính của đối tượng bằng cách sử dụng các khóa chuỗi. Nó cho phép thiết lập và truy xuất giá trị một cách động mà không cần gọi trực tiếp các phương thức getter hoặc setter.

KVC được sử dụng rộng rãi trong các framework liên kết và tuần tự hóa của Cocoa. Nó dựa trên một mô hình tra cứu được định nghĩa rõ ràng để giải quyết các khóa và hỗ trợ các toán tử tập hợp để làm việc với mảng và tập hợp.

Ví dụ, valueForKey: truy xuất giá trị một cách động, trong khi setValue:forKey: Gán một giá trị. Việc sử dụng khóa không chính xác có thể dẫn đến lỗi ngoại lệ khi chạy, do đó cần phải kiểm tra kỹ lưỡng.


19) KVO (Quan sát giá trị khóa) là gì và nó khác với thông báo như thế nào?

Giao thức Quan sát Giá trị Khóa (KVO) cho phép các đối tượng quan sát sự thay đổi của các thuộc tính cụ thể của một đối tượng khác. Nó được liên kết chặt chẽ với KVC và cho phép gửi thông báo tự động khi giá trị thuộc tính thay đổi.

Khác với thông báo, KVO có tính chi tiết cao và phụ thuộc vào thuộc tính cụ thể, trong khi thông báo được phát sóng theo kiểu broadcast. KVO yêu cầu loại bỏ trình quan sát đúng cách để tránh sự cố, trong khi thông báo có tính liên kết lỏng lẻo hơn.

KVO lý tưởng để theo dõi các thay đổi mô hình trong kiến ​​trúc MVC, trong khi thông báo phù hợp hơn cho các sự kiện trên toàn hệ thống.


20) Việc sử dụng Objective-C hiện nay có những ưu điểm và nhược điểm gì?

Objective-C cung cấp các tính năng thời gian chạy động, bộ công cụ hoàn thiện và khả năng tích hợp sâu rộng với các framework cũ của Apple. Nó cho phép xử lý thông báo linh hoạt và vẫn được sử dụng rộng rãi trong các codebase lớn, đã hoàn thiện.

Tuy nhiên, Objective-C có cú pháp dài dòng, khó học hơn và phần lớn đã được thay thế bởi... Swift Dành cho sự phát triển mới. Swift Cung cấp các cải tiến về độ an toàn, khả năng đọc hiểu và tối ưu hóa hiệu suất.

Yếu tố Ưu điểm Nhược điểm
Runtime Năng động Phức tạp
cú pháp Quyền lực Dài dòng
Hệ sinh thái Người Lớn Tỷ lệ áp dụng giảm

21) Hãy giải thích vòng đời của lớp Objective-C từ khi cấp phát đến khi giải phóng bộ nhớ.

Vòng đời của một đối tượng Objective-C bắt đầu từ việc cấp phát bộ nhớ và kết thúc bằng việc giải phóng bộ nhớ. Vòng đời này được quản lý chủ yếu thông qua ARC hoặc đếm tham chiếu thủ công trong các hệ thống cũ. Quá trình bắt đầu với alloc, thao tác này cấp phát bộ nhớ cho đối tượng và khởi tạo các biến thể hiện của nó về giá trị mặc định. Tiếp theo đó là init, thao tác này chuẩn bị đối tượng để sử dụng bằng cách thiết lập trạng thái ban đầu.

Sau khi được khởi tạo, đối tượng sẽ tồn tại miễn là còn ít nhất một tham chiếu mạnh. Trong suốt vòng đời của mình, đối tượng có thể nhận thông báo, tham gia vào việc ủy ​​quyền và tương tác với các đối tượng khác. Khi tất cả các tham chiếu mạnh được giải phóng, ARC sẽ tự động gọi phương thức này. dealloc, nơi thực hiện các tác vụ dọn dẹp như loại bỏ các trình quan sát hoặc giải phóng tài nguyên.

Hiểu rõ vòng đời này là điều cần thiết để tránh rò rỉ bộ nhớ, con trỏ lơ lửng và xử lý tài nguyên không đúng cách.


22) Cơ chế chuyển tiếp tin nhắn hoạt động như thế nào trong Objective-C?

Chuyển tiếp thông báo là một cơ chế nhiều bước được sử dụng khi một đối tượng nhận được một thông báo mà nó không thể xử lý. Thay vì gây lỗi ngay lập tức, Objective-C cung cấp một số cơ hội để giải quyết phương thức một cách động. Đầu tiên, thời gian chạy kiểm tra +resolveInstanceMethod: để xem liệu phương thức có thể được thêm vào một cách động hay không. Nếu không giải quyết được, nó sẽ tiếp tục -forwardingTargetForSelector: Để chuyển hướng thông báo đến một đối tượng khác.

Nếu điều đó thất bại, môi trường thực thi sẽ gọi -methodSignatureForSelector:-forwardInvocation: Để chuyển tiếp tin nhắn theo cách thủ công. Điều này cho phép sử dụng các đối tượng proxy, decorator và các hành vi động.

Cơ chế này làm nổi bật tính linh hoạt của Objective-C và thường được sử dụng trong các framework như NSProxy và các thư viện giả lập.


23) Chu trình giữ lại là gì và làm thế nào để ngăn ngừa chúng?

Chu kỳ giữ (retain cycle) xảy ra khi hai hoặc nhiều đối tượng giữ các tham chiếu mạnh đến nhau, ngăn cản ARC giải phóng chúng. Điều này dẫn đến rò rỉ bộ nhớ, ngay cả khi các đối tượng không còn cần thiết nữa. Chu kỳ giữ thường xảy ra giữa các đối tượng cha và con, các delegate và các khối (block capture). self.

Để ngăn chặn các vòng lặp giữ tham chiếu, các nhà phát triển sử dụng tham chiếu yếu cho các mối quan hệ không phải là quyền sở hữu, chẳng hạn như ủy quyền. Trong các khối, __weak or __unsafe_unretained tham chiếu đến self được sử dụng để tránh bị bắt giữ mạnh.

Việc xác định các chu kỳ giữ tham chiếu bằng Instruments và thiết kế cẩn thận ngữ nghĩa quyền sở hữu là những kỹ năng quan trọng đối với các nhà phát triển Objective-C làm việc trên các ứng dụng chạy dài hạn.


24) Objective-C xử lý đồng thời và đa luồng như thế nào?

Objective-C cung cấp nhiều cơ chế xử lý song song, trong đó Grand Central Dispatch (GCD) là cơ chế được sử dụng rộng rãi nhất. GCD cho phép các nhà phát triển gửi các tác vụ đến các hàng đợi để thực thi tuần tự hoặc song song. Nó trừu tượng hóa việc quản lý luồng, cải thiện hiệu suất và độ an toàn.

Các công cụ xử lý đồng thời khác bao gồm NSThread, NSOperationNSOperationQueue. Trong khi NSThread Cung cấp khả năng điều khiển ở mức độ thấp. NSOperationQueue Cung cấp chức năng quản lý phụ thuộc, hủy bỏ và xử lý ưu tiên.

Thuật toán GCD thường được ưu tiên sử dụng cho các đoạn mã yêu cầu hiệu năng cao, trong khi NSOperationQueue Phù hợp với các quy trình làm việc phức tạp đòi hỏi sự kiểm soát chi tiết.


25) Phương pháp khuấy trộn là gì và khi nào nên sử dụng phương pháp này?

Kỹ thuật hoán đổi phương thức (method swizzling) là một kỹ thuật thời gian chạy cho phép các nhà phát triển trao đổi cách triển khai của hai phương thức. Điều này được thực hiện bằng cách sử dụng các API thời gian chạy của Objective-C và cho phép sửa đổi hành vi mà không cần tạo lớp con hoặc sửa đổi mã nguồn gốc.

Kỹ thuật Swizzling thường được sử dụng trong các framework phân tích, ghi nhật ký, gỡ lỗi và kiểm thử. Tuy nhiên, cần sử dụng nó một cách thận trọng vì nó có thể gây ra hành vi không mong muốn, làm cho việc gỡ lỗi trở nên khó khăn và làm hỏng chức năng nếu các triển khai bên dưới thay đổi.

Trong mã nguồn sản xuất, việc hoán đổi phương thức cần được ghi chép cẩn thận và giới hạn trong các trường hợp sử dụng được xác định rõ ràng để duy trì tính ổn định của mã.


26) Hãy giải thích sự khác biệt giữa bản sao nông (shallow copy) và bản sao sâu (deep copy) trong Objective-C.

Sao chép nông (shallow copy) chỉ sao chép đối tượng chứa (container) chứ không sao chép các đối tượng bên trong nó. Cả đối tượng chứa ban đầu và đối tượng được sao chép đều tham chiếu đến cùng một đối tượng cơ bản. Ngược lại, sao chép sâu (deep copy) sao chép cả đối tượng chứa và tất cả các đối tượng lồng nhau, tạo ra các bản sao độc lập.

Các lớp tập hợp trong Objective-C thường thực hiện sao chép nông theo mặc định. Sao chép sâu yêu cầu triển khai rõ ràng, thường sử dụng NSCopying hoặc lặp lại thủ công.

Sao chép Loại Container đã được sao chép Các phần tử đã được sao chép
Không sâu Không
Sâu

Hiểu rõ sự khác biệt này là điều cần thiết khi làm việc với các cấu trúc dữ liệu có thể thay đổi để tránh các tác dụng phụ không mong muốn.


27) Objective-C hỗ trợ quá trình tự phản tỉnh như thế nào?

Trong Objective-C, cơ chế tự phản chiếu cho phép các đối tượng kiểm tra cấu trúc và hành vi của chính chúng trong thời gian chạy. Điều này bao gồm kiểm tra tư cách thành viên lớp, tính khả dụng của phương thức và sự tuân thủ giao thức. Các phương thức như... isKindOfClass:, respondsToSelector:conformsToProtocol: được sử dụng phổ biến.

Tự phản chiếu cho phép lập trình phòng thủ và thích ứng hành vi động. Ví dụ, một đối tượng có thể kiểm tra xem đối tượng khác có triển khai một phương thức hay không trước khi gọi nó, cải thiện tính an toàn khi chạy.

Khả năng này đặc biệt hữu ích trong các hệ thống liên kết lỏng lẻo và kiến ​​trúc dựa trên plugin.


28) Sự khác biệt giữa isEqual: và == trong Objective-C là gì?

== Toán tử này so sánh các địa chỉ bộ nhớ, xác định xem hai tham chiếu có trỏ đến cùng một đối tượng hay không. isEqual: Phương thức này so sánh nội dung hoặc sự bằng nhau về mặt logic của các đối tượng.

Ví dụ, hai đối tượng chuỗi khác nhau có cùng nội dung văn bản có thể trả về NO khi so sánh bằng cách sử dụng ==, Nhưng YES khi so sánh bằng cách sử dụng isEqual:. Nhiều Foundation các lớp ghi đè isEqual: Để cung cấp những so sánh bình đẳng có ý nghĩa.

Việc lựa chọn phương pháp so sánh chính xác là rất quan trọng để tránh các lỗi logic, đặc biệt khi làm việc với các tập hợp như tập hợp và từ điển.


29) Objective-C tích hợp với C như thế nào? C++ mã số?

Objective-C hoàn toàn tương thích với C và có thể tương tác với các ngôn ngữ khác. C++ thông qua Mục tiêu-C++. Bằng cách sử dụng .mm các tập tin, các nhà phát triển có thể kết hợp Objective-C và C++ mã trong cùng một tệp nguồn.

Sự tích hợp này cho phép tái sử dụng C và các mã C hiện có. C++ Các thư viện này tận dụng được các tính năng hướng đối tượng của Objective-C. Các nhà phát triển cần quản lý việc thay đổi tên đối tượng và vòng đời đối tượng một cách cẩn thận để tránh các vấn đề về bộ nhớ và khả năng tương thích.

Khách quan-C++ Nó thường được sử dụng trong các ứng dụng đòi hỏi hiệu năng cao, chẳng hạn như công cụ trò chơi và xử lý đa phương tiện.


30) Khi nào bạn nên chọn Objective-C thay vì... Swift Trong quá trình phát triển hiện đại?

Objective-C vẫn là một lựa chọn hợp lý khi cần bảo trì các codebase cũ có dung lượng lớn, tích hợp với các framework cũ hơn hoặc yêu cầu các tính năng runtime nâng cao mà khó có thể đạt được bằng các ngôn ngữ khác. SwiftHệ thống nhắn tin động và các công cụ hoàn thiện của nó làm cho nó phù hợp với một số tác vụ phát triển cấp thấp hoặc hướng đến khung phần mềm.

Tuy nhiên, đối với các dự án mới, Swift Phương pháp này thường được ưa chuộng hơn do cải thiện về độ an toàn, khả năng đọc hiểu và hiệu suất. Quyết định nên dựa trên yêu cầu của dự án, chuyên môn của nhóm và khả năng bảo trì lâu dài.

Nắm vững Objective-C vẫn rất có giá trị, đặc biệt là trong các doanh nghiệp đã có nhiều ứng dụng Objective-C hiện có.


🔍 Các câu hỏi phỏng vấn Objective-C hàng đầu kèm theo các tình huống thực tế và câu trả lời chiến lược

1) Những điểm khác biệt chính giữa Objective-C và... là gì? SwiftVậy khi nào bạn vẫn sẽ chọn Objective-C?

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá sự hiểu biết của bạn về hệ sinh thái ngôn ngữ và khả năng đưa ra các quyết định kiến ​​trúc dựa trên thông tin đầy đủ.

Câu trả lời ví dụ: Objective-C là một ngôn ngữ động, dựa trên thông điệp với khả năng thực thi mạnh mẽ, trong khi Swift Nó nhấn mạnh tính an toàn, hiệu năng và cú pháp hiện đại. Tôi vẫn sẽ chọn Objective-C khi bảo trì hoặc mở rộng các hệ điều hành iOS cũ lớn hoặc macOS các cơ sở mã nơi việc viết lại Swift sẽ gây ra rủi ro hoặc chi phí không cần thiết.


2) Cơ chế quản lý bộ nhớ hoạt động như thế nào trong Objective-C dưới môi trường ARC?

Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự hiểu biết của bạn về các nguyên tắc cơ bản quản lý bộ nhớ và cách ARC đơn giản hóa chúng.

Câu trả lời ví dụ: Theo ARC, trình biên dịch tự động chèn các lệnh retain và release trong quá trình biên dịch. Các nhà phát triển vẫn cần tránh các vòng lặp tham chiếu mạnh bằng cách sử dụng các tham chiếu yếu hoặc gán một cách thích hợp, đặc biệt là trong các mẫu ủy quyền và sử dụng khối.


3) Bạn có thể giải thích sự khác biệt giữa các thuộc tính mạnh, yếu và gán không?

Mong đợi từ ứng viên: Người phỏng vấn muốn đảm bảo bạn hiểu về quyền sở hữu đối tượng và quản lý vòng đời của đối tượng.

Câu trả lời ví dụ: Các thuộc tính mạnh làm tăng số lần giữ lại và giữ cho đối tượng tồn tại. Các thuộc tính yếu không giữ lại đối tượng và được đặt thành nil khi đối tượng được giải phóng. Phương thức assign thường được sử dụng cho các kiểu dữ liệu nguyên thủy và không quản lý quyền sở hữu đối tượng.


4) Hãy mô tả một lần bạn gỡ lỗi một sự cố nghiêm trọng trong ứng dụng Objective-C.

Mong đợi từ ứng viên: Người phỏng vấn đang đánh giá phương pháp giải quyết vấn đề và kỹ năng gỡ lỗi của bạn.

Câu trả lời ví dụ: Trong vai trò trước đây, tôi đã gỡ lỗi một sự cố sập hệ thống lặp đi lặp lại do việc giải phóng quá mức các đối tượng trong môi trường đa luồng. Tôi đã sử dụng Instruments với chức năng Zombies được bật để theo dõi quá trình giải phóng bộ nhớ và xác định được một thuộc tính không chính xác, và sau khi sửa lỗi, sự cố đã được giải quyết.


5) Trong Objective-C, các danh mục khác với các lớp con như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá sự hiểu biết của bạn về cấu trúc và khả năng mở rộng của mã nguồn.

Câu trả lời ví dụ: Các danh mục cho phép thêm các phương thức vào một lớp hiện có mà không cần tạo lớp con, điều này rất hữu ích cho việc phân chia chức năng thành các mô-đun. Lớp con tạo ra các hệ thống phân cấp lớp mới và có thể ghi đè hành vi, nhưng chúng làm tăng tính phụ thuộc và độ phức tạp.


6) Khối lệnh (block) trong Objective-C là gì và chúng thường được sử dụng như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự quen thuộc của bạn với các mẫu lập trình Objective-C hiện đại.

Câu trả lời ví dụ: Block là các closure bao bọc mã và các biến được nắm bắt. Chúng thường được sử dụng cho các hàm gọi lại bất đồng bộ, trình xử lý hoàn thành và liệt kê. Cần phải cẩn thận để tránh các vòng lặp giữ bằng cách sử dụng các tham chiếu yếu đến chính nó.


7) Bạn sẽ xử lý đa luồng và xử lý song song trong Objective-C như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn muốn biết bạn đảm bảo hiệu suất và khả năng phản hồi như thế nào.

Câu trả lời ví dụ: Ở vị trí trước đây, tôi phụ thuộc rất nhiều vào Grand Central Dispatch để quản lý các tác vụ nền và cập nhật giao diện người dùng. Tôi sử dụng hàng đợi tuần tự để đảm bảo tính nhất quán dữ liệu và hàng đợi song song cho các thao tác đòi hỏi hiệu năng cao.


8) Hãy giải thích mô hình ủy quyền (delegate pattern) và những ưu điểm của nó.

Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự hiểu biết của bạn về các mẫu thiết kế phổ biến trong phát triển ứng dụng iOS.

Câu trả lời ví dụ: Mẫu thiết kế ủy quyền (delegate pattern) cho phép một đối tượng truyền đạt các sự kiện hoặc dữ liệu trở lại đối tượng khác mà không cần liên kết chặt chẽ. Nó thúc đẩy sự tách biệt các mối quan tâm và giúp mã dễ kiểm thử và bảo trì hơn.


9) Hãy mô tả cách bạn sẽ tái cấu trúc một codebase Objective-C lớn, cũ.

Mong đợi từ ứng viên: Người phỏng vấn đang đánh giá khả năng tư duy chiến lược và kinh nghiệm của bạn với các hệ thống cũ.

Câu trả lời ví dụ: Trong vai trò trước đây, tôi tiếp cận việc tái cấu trúc mã một cách từng bước bằng cách thêm các bài kiểm thử đơn vị trước, cô lập các thành phần quan trọng và cải thiện khả năng đọc hiểu mã. Tôi tránh việc viết lại toàn bộ mã nguồn và tập trung vào việc giảm thiểu nợ kỹ thuật một cách an toàn theo thời gian.


10) Làm thế nào để bạn đảm bảo chất lượng và khả năng bảo trì mã nguồn trong các dự án Objective-C?

Mong đợi từ ứng viên: Người phỏng vấn muốn hiểu rõ hơn về chuyên ngành kỹ thuật và khả năng làm việc nhóm của bạn.

Câu trả lời ví dụ: Ở công việc trước đây, tôi luôn nhấn mạnh đến các tiêu chuẩn lập trình nhất quán, việc xem xét mã nguồn kỹ lưỡng và việc lập tài liệu. Tôi cũng khuyến khích việc viết các thành phần có thể tái sử dụng và sử dụng các công cụ phân tích tĩnh để phát hiện lỗi sớm.

Tóm tắt bài viết này với: