Objective-C là ngôn ngữ lập trình đầu tiên. Phát triển iOS cho người mới bắt đầu: học cách tạo ứng dụng iOS từ đầu

Hướng dẫn này chứa thông tin hữu ích về ngôn ngữ Objective-C, cơ sở và Tính năng bổ sung. Cuốn sách chứa mọi thứ bạn cần để tạo ứng dụng cho iPod Touch và iPhone 3G với Trợ giúp của Apple SDK. Phần lớn tài liệu được dành cho việc phát triển các giao diện dành cho người lập trình, công cụ cơ sở dữ liệu SQLite và xử lý XML Hbxml2.

Khi tạo hướng dẫn “Lập trình cho iPhone”, tác giả đã ca ngợi khả năng của iPhone như một công cụ định vị GPS. Lập trình iPhone dành riêng cho các nhà phát triển có trình độ kiến ​​​​thức cao để cải thiện kỹ năng của họ và tiếp thu những kỹ năng mới. Tác giả Maher Ali đã tính đến tất cả những điều cần thiết trong cuốn sách của mình, điều này chắc chắn xứng đáng số lượng lớn phản hồi tích cực và điểm cao.

Đối với những người muốn làm việc với các sản phẩm của Apple, những cái tên Xcode, iOS và Mac OS X không chỉ là những từ trống rỗng mà còn là các công cụ phát triển và hệ điều hành. Một người mới bắt đầu lập trình và một chuyên gia muốn tìm hiểu các nguyên tắc phát triển phần mềm trong Objective-C đều sẽ tìm thấy như nhau. cuốn sách hữu ích Aaron Hillegass "Mục tiêu-C. Lập trình cho iOS và MacOS."

Cho đến gần đây, chính sách lập trình của Apple, nói một cách nhẹ nhàng, là đóng cửa và việc tìm kiếm các công cụ tạo chương trình cho MacOS đơn giản là không thực tế. Hôm nay khi thị trường máy tính ngày càng trở nên di động hơn và thị phần của iPhone, iPad và các thiết bị iOS khác trong đó ngày càng tăng lên, đặc biệt là do số lượng khổng lồ chương trình miễn phí, sự xuất hiện của các công cụ phát triển trong Objective-C, một ngôn ngữ được thiết kế đặc biệt cho những mục đích này, đã trở nên hoàn toàn hợp lý. Hôm nay có ai muốn tham gia không thế giới táo, có thể tải xuống miễn phí từ Mac Cửa hàng ứng dụng Xcode và bắt đầu lập trình cho cả iOS và Mac OS X, trong đó cuốn sách “Objective-C” của Aaron Hillegass sẽ giúp ích cho anh ấy. Lập trình cho iOS và MacOS."

Tiêu đề ban đầu của sổ tay này là "Lập trình Objective-C: Hướng dẫn về trang trại Big Nerd" và dựa trên khóa đào tạo do trung tâm giáo dục Big Nerd Ranch phát triển như một khóa học giới thiệu về lập trình trong Mục tiêu C. Cấu trúc của sổ tay này đến mức nó sẽ hữu ích như nhau cho cả những người mới bắt đầu lập trình và những chuyên gia muốn làm quen với một lĩnh vực ứng dụng kỹ năng khác của họ - lập trình cho thiết bị di động và máy tính Apple. Để làm cơ sở đào tạo, cuốn sách cung cấp iOS 5 và Max OS X 10.7 Lion, nổi tiếng về tính ổn định và phiên bản được chọn để phát triển phần mềm là Xcode 4.2.

Hiện nay hầu hết mọi người đều sử dụng thiết bị mới nhất Các thiết bị dựa trên iOS như iPhone và iPad. Chúng được sử dụng trong công việc, học tập và giải trí nói chung. Và đối với những thiết bị này bạn có thể nghĩ ra ứng dụng thú vị nhất và các chương trình. Nếu bạn có những suy nghĩ như vậy nhưng không biết bắt đầu từ đâu thì cuốn sách này sẽ chỉ giúp bạn thực hiện những bước đi đầu tiên.

Hướng dẫn sẽ giải thích ngay từ đầu cách bạn có thể tạo ứng dụng mới cho thiết bị iPhone và iPad. Hướng dẫn sẽ hướng dẫn mọi người cách thiết kế một ứng dụng mới và đưa nó vào cuộc sống trong thời gian ngắn nhất có thể. Cuốn sách sẽ mang đến cho mọi người cơ hội tạo ra ứng dụng đầu tiên, độc đáo của mình, đây chắc chắn sẽ không phải là ứng dụng cuối cùng.

Cuốn sách sẽ giúp mọi người nắm vững kiến ​​​​thức cơ bản về lập trình trong Objective-C, cũng như hiểu cách làm việc với các công cụ SDK iPhone. Sách hướng dẫn này sẽ dạy mọi người từ đầu và giúp họ trở thành bậc thầy trong việc tạo ứng dụng mới cho các thiết bị phổ biến nhất. Tất cả những gì bạn cần là sự khao khát và nhiệt huyết lớn lao; sách giáo khoa sẽ làm phần còn lại. Anh ấy sẽ cung cấp cho mọi người những kiến ​​thức cần thiết và nền tảng cơ bản để bất kỳ ai cũng có thể bắt đầu sáng tạo cho riêng mình, ứng dụng độc đáo cho các thiết bị iPhone và iPad.

Cuốn sách sẽ bắt đầu với những bước đầu tiên và những thuật ngữ cơ bản mà mọi người nên biết trước khi bắt tay vào công việc. Đây là một trong những phần quan trọng nhất của cuốn sách mà mọi độc giả nên đặc biệt chú ý. Rốt cuộc, ở đây chỉ có tất cả các kỹ năng cơ bản mới được giải thích và sau đó chúng sẽ cần được sử dụng trong thực tế.

Phần tiếp theo của hướng dẫn sẽ cho bạn biết về tất cả các loại ứng dụng dành cho iPhone và iPad và hướng dẫn bạn các kỹ năng cơ bản để tạo chúng. Sau đó sẽ có một chương đặc biệt dành riêng cho việc học cách làm việc với chương trình Objective-C và tất cả các chương trình của nó. chức năng hữu ích, điều mà mọi chuyên gia lập trình đều nên biết.

Chương tiếp theo của hướng dẫn sẽ cho chúng ta biết về nhiều chế độ xem và hiển thị các bảng chi tiết về chủ đề này. Mọi thứ sẽ được trình bày đơn giản đến mức bất kỳ người mới bắt đầu hoặc lập trình viên thiếu kinh nghiệm nào cũng có thể nhanh chóng nắm bắt được bản chất của vấn đề và hiểu được chủ đề này. Chủ đề tiếp theo trong cuốn sách sẽ là về chế độ xem phương thức và tất cả các chức năng của nó.

Tiếp theo, cuốn sách sẽ giới thiệu cho chúng ta cách lưu ứng dụng, chỉnh sửa và sắp xếp chúng. Dưới đây là các kỹ thuật chỉnh sửa khác nhau mà mọi lập trình viên nên biết. Họ cũng sẽ cho chúng tôi biết cách phát triển các ứng dụng doanh nghiệp.

Trong hướng dẫn này, chúng ta sẽ tìm thấy các phần về di chuyển và tối ưu hóa với Dữ liệu cốt lõi. Và trong một trong những phần quan trọng nhất, chúng ta sẽ tìm hiểu cách tạo giao diện cho ứng dụng của mình và tìm hiểu tất cả về giao diện tự nhiên.

Cũng trong cuốn sách “Lập trình cho iPhone và iPad”, chúng ta có thể tìm thấy hai ứng dụng quan trọng ở phần cuối. Phần đầu tiên sẽ đề cập đến bốn chủ đề liên quan chưa được trình bày trong các chương của cuốn sách này. Và trong phụ lục thứ hai, các tác giả của cuốn sách, D. Pailon và T. Pailon, hướng dẫn mỗi độc giả cách chuẩn bị dự án của riêng họ để phân phối.

Cuốn sách này sẽ cung cấp thông tin cần thiết về những điều cơ bản trong việc phát triển các ứng dụng và chương trình mới cho iPhone, iPad và iPod touch. Sách hướng dẫn này sẽ được viết dưới dạng thú vị, không chứa nhiều thuật ngữ nặng nề. Vì vậy, bất kỳ người mới bắt đầu nào cũng sẽ rất vui khi nắm vững tài liệu này và khéo léo áp dụng nó vào thực tế.

Cuốn sách sẽ bắt đầu bằng một chương, với Tên thu vị- Chào mừng đến với rừng rậm. Không phải ngẫu nhiên mà các tác giả sử dụng những từ vựng như vậy, bởi vì họ cố gắng thu hút người đọc và trình bày những thông tin phức tạp theo cách đơn giản và thú vị nhất. Chương này sẽ nói về tất cả các kỹ năng cơ bản cần thiết để tạo ra loại chương trình này.

Chương tiếp theo của hướng dẫn này sẽ chỉ cho chúng ta cách tạo các ứng dụng mới trong môi trường Xcode và cũng sẽ chỉ cho chúng ta cách sử dụng các chương trình khác nhau cho loại công việc này. Sau này, chúng tôi cũng sẽ được giúp hiểu cách đánh bóng các ứng dụng của chúng tôi và tất cả các chi tiết cuối cùng.

Chương tiếp theo của cuốn sách này sẽ dành cho các bài tập mới với giao diện, nơi chúng ta có thể tìm hiểu những thông tin rất hữu ích. Ở đây chúng ta sẽ gặp các điều khiển chủ động và thụ động và tìm hiểu cách làm việc với chúng. Ngoài ra, phần này của sách giáo khoa sẽ cho chúng ta biết về biểu diễn đồ họa và về việc xác định kết quả đầu ra và hành động. Chương này sẽ là một trong những chương lớn nhất và sẽ có thông tin quan trọng cho công việc và tạo ra các ứng dụng mới.

Một chủ đề khác trong cuốn sách này sẽ được dành cho việc tự động xoay và thay đổi kích thước. Tại đây, mọi người mới bắt đầu sẽ có thể học cách xử lý các phép quay bằng cách thay đổi kích thước, cũng như thiết lập các hỗ trợ cho phép xoay mong muốn.

Các tác giả Dave Mark, Jack Nutting và Jeff LaMarche dành các phần tiếp theo của cuốn sách này để đề cập đến các hàm, bảng và phương pháp thiết yếu khác nhau để tạo các ứng dụng mới. Cuốn sách “Phát triển ứng dụng cho iPhone, iPad và iPod touch với sử dụng iOS SDK.RUS.2012" sẽ giới thiệu chi tiết cho chúng ta về bộ điều khiển điều hướng và các hệ thống bảng khác nhau. Tại đây chúng ta có thể tìm hiểu tất cả các tính năng lập trình cho iPad và tìm hiểu cách tạo Dự án mới nhất. Cũng trong hướng dẫn này, chúng ta sẽ tìm hiểu mọi thứ về cài đặt người dùng và cách chúng hoạt động, cũng như làm quen với tính năng lưu giữ dữ liệu. Mọi người ở đây đều có thể học cách tổ chức các hoạt động xử lý nền khác nhau những công nghệ mới nhất và có nghĩa là. Vì vậy, những ai muốn sáng tạo những điều mới mẻ nên đọc cuốn sách này. ứng dụng sáng tạo cho các thiết bị phổ biến nhất.

Cuốn sách "Objective-C 2.0 và Lập trình cho Mac" chứa nhiều tài liệu về dạy lập trình bằng ngôn ngữ Objective-C. Là ngôn ngữ chính để tạo ứng dụng cho Mac OS X và iPhone, hiện nay nó ngày càng trở nên phổ biến và có nhu cầu. Mac là một nền tảng khá mạnh mẽ và Objective-C lý tưởng cho việc viết Mã chương trình dưới nó. Cuốn sách tiết lộ các khả năng phong phú của Objective-C, đặc biệt là các giao thức và khả năng khởi tạo. Môi trường phát triển cho Mac Xcode và bộ công cụ Cocoa cũng được mô tả. Người đọc không chỉ có thể học ngôn ngữ lập trình Objective-C cho Mac OS X và iPhone mà còn có thể học các khái niệm lập trình nâng cao như nguyên tắc đóng mở, lập trình hướng đối tượng, mã hóa khóa/giá trị, tái cấu trúc và vị từ. Cuốn sách được viết với phong cách đơn giản và thậm chí vui vẻ, điều này sẽ khiến việc nghiên cứu tài liệu trở nên cực kỳ dễ dàng và thú vị.

Cuốn sách “iPhone. Phát triển ứng dụng nguồn mở" hoàn toàn dành cho việc phát triển ứng dụng cho iPhone trong Objective-C thông qua việc sử dụng nhiều nhất phiên bản mới nhất chương trình iPhone API mã nguồn mở đã được cập nhật cho phần mềm iPhone 2.x và 3G. Cuốn sách này bao gồm việc chạy và tùy chỉnh các ứng dụng iPhone cũng như thiết kế giao diện người dùng bằng UIK.it. Ấn phẩm này mô tả chi tiết về lập trình đồ họa, bao gồm hoạt hình, cũng như chuyển đổi bề mặt ba chiều. Ở đây người ta chú ý khá nhiều đến vấn đề ghi và phát lại các tệp âm thanh khác nhau sau đó. Ứng dụng này mô tả cẩn thận các kỹ thuật lập trình khác nhau cũng như các lớp mã nguồn mở, được thiết kế để viết các ứng dụng iPhone bằng chính đôi tay của bạn. Cuốn sách được mô tả được tạo ra cho các lập trình viên.

Nghề lập trình viên là một trong những nghề uy tín và có nhu cầu cao nhất, đó là sự thật. Ngành công nghiệp phát triển phần mềm có những ngóc ngách của nó. Trong số này, phát triển nhanh nhất và đồng thời được trả lương cao nhất là phát triển phần mềm cho thiết bị di động. Như bạn đã biết, điều đó đã xảy ra khi bỏ xa các đối thủ của họ, ba đối thủ không ngừng dẫn đầu. Bí quyết là một trong ba người này là người dẫn đầu không thể tranh cãi, trong khi luôn có người đuổi kịp.

Trong phân khúc công nghệ di động, Apple chắc chắn là người dẫn đầu với điện thoại thông minh iPhone. Tại buổi thuyết trình được tổ chức vào tháng 9, công ty Cupertino đã trình diễn phiên bản thứ 7 của thiết bị di động. Cùng với đó, Apple đã giới thiệu một phiên bản mới của hệ điều hành di động của mình. hệ thống iOS 10. Hiện nay nó là hệ điều hành quan trọng nhất trên thế giới, giống như các hệ điều hành trước đó. Từ đó, việc học phát triển iOS là điều quan trọng nhất đầu tư sinh lời thời gian và tiền bạc.

hệ sinh thái táo

Hôm nay chúng ta sẽ phát triển một ứng dụng di động đơn giản dành cho iOS. Tất nhiên, máy Mac gốc là phù hợp nhất cho việc này. Nhưng nếu bạn là người ủng hộ Windows hoặc đơn giản là bạn không có máy Mac, bạn có thể cài đặt hệ điều hành macOS cho máy ảo trên Windows. Trên Internet, sẽ không khó để bạn tìm thấy một phiên bản macOS được thiết kế riêng cho PC, thường được gọi là Hackintosh. Vui lòng cài đặt nó trên máy ảo VMware, VirtualBox - sự lựa chọn của bạn. Hãy để tôi cảnh báo ngay với bạn rằng bàn phím PC không có một số phím như trên bàn phím Mac và nhiều tổ hợp của chúng không thể nhấn được trong Hackintosh. Điều này khá nhiều làm hỏng tâm trạng. Nếu không, tất cả các thao tác được mô tả bên dưới có thể được thực hiện thành công trên Hackintosh.

Kiến thức cần thiết

Để lập trình nói chung và cho iOS nói riêng thì bạn cần phải biết khá nhiều. Toán học và logic có thể không cần thiết lúc đầu, nhưng sau này chúng sẽ được yêu cầu. Công nghệ hiện đại đã loại bỏ nhu cầu lập trình viên phải có kiến ​​thức sâu rộng về kiến ​​trúc máy tính, nhưng cần phải hiểu các cơ chế cơ bản như hệ thống số, chuyển đổi của chúng, tốc độ của chương trình con hoặc hiệu quả của thuật toán (big O).

Để biết thêm cấp độ cao Nhà phát triển iOS cần có kiến ​​thức sâu về hệ điều hành macOS và chính iOS. Bạn cũng cần thành thạo ngôn ngữ lập trình Apple. Kiến thức về Delphi, C++, C# hay VB.NET sẽ không giúp ích gì nhiều cho bạn. Apple có hệ sinh thái riêng với ngôn ngữ riêng: Objective-C và Swift. Tất nhiên, kiến ​​thức về C++ chưa bao giờ gây hại cho bất kỳ ai; các chương trình và phần chèn dựa trên nó có ở khắp mọi nơi, ngay cả tại Apple. Nhưng theo định nghĩa, Objective-C được sử dụng nhiều nhất, đơn giản vì nó xuất hiện sớm hơn nhiều (vào giữa những năm 80 của thế kỷ trước), trong khi Swift chỉ cách đây hai năm (năm 2014). Apple đặt nhiều hy vọng vào ngôn ngữ mới và đang đầu tư rất nhiều vào nó. Objective-C được sử dụng để hỗ trợ phần mềm cũ và phần mềm mới được viết bằng Swift. Vì vậy, thật tốt khi bạn biết cả hai.

Để không lãng phí thời gian, bạn có thể học tất cả các ngôn ngữ lập trình này dưới sự giám sát chặt chẽ của giáo viên trên trang web.

Công cụ phát triển

Như bạn đã biết, công cụ chính dành cho nhà phát triển macOS và cùng với nó là iOS là môi trường lập trình Xcode. Nó bao gồm các công cụ để tạo ứng dụng cho Mac, iPhone, iPad, Apple TV, Đồng hồ Apple. Tất cả các nền tảng của Apple. Xcode chứa Trình tạo giao diện, trình soạn thảo mã hỗ trợ mọi thứ phương tiện hiện đại làm việc với mã. Ngoài ra, không cần rời khỏi Xcode, bạn có thể kiểm tra ứng dụng; nếu nó được phát triển cho một thiết bị bên ngoài thì nó có thể chạy trong trình giả lập.

Hệ thống này bao gồm trình giả lập của tất cả các thiết bị, có thể tải xuống các phiên bản mới của chúng. Ngoài ra Xcode còn chứa công cụ đồ họađể phân tích hiệu suất ứng dụng, bao gồm các công cụ chẩn đoán tải CPU, mức sử dụng bộ nhớ (HDD, SDD và các loại khác), tải trên bộ điều hợp đồ họa (từ phía OpenGL).

Vào ngày 13 tháng 9, một phiên bản mới rất được mong đợi của môi trường phát triển 8.0 đã được phát hành. Phiên bản ổn định có thể được tải xuống miễn phí từ App Store. Alpha và beta được phân phối theo đăng ký của nhà phát triển. Phiên bản thứ tám bao gồm: phiên bản mới của ngôn ngữ Swift 3, công cụ học tập Swift Playground cho iPad, phiên bản mới của Trình tạo giao diện, đã trở nên nhanh hơn và cho phép bạn xem bố cục ứng dụng trên các nền tảng khác nhau mà không cần phải triển khai ứng dụng trên trình mô phỏng.

Xcode 8 có thể được sử dụng để phát triển ứng dụng cho macOS Sierra, iOS 10, watchOS 3 và tvOS 10. Tất cả SDK đều có sẵn. Các phiên bản hệ điều hành mới bắt đầu xuất hiện liên tục ngay sau đó Bài thuyết trình của Apple, được tổ chức vào đầu tháng 9.

Ngôn ngữ Objective-C

Chúng ta hãy nhớ lại ngắn gọn những thông tin cơ bản về ngôn ngữ. Objective-C - Đối tượng được biên dịch định hướng ngôn ngữ lập trình được sử dụng để viết ứng dụng cho hệ thống Apple. Nó là một superset hay nói cách khác là một tiện ích bổ sung cho C, kế thừa cú pháp, kiểu dữ liệu, phương thức giám sát tiến trình thực hiện chương trình và thêm các khả năng dựa trên đối tượng vào nó. lập trình định hướng- mô tả các lớp và phương thức.

Giống như trong C++, trong Objective-C, vai trò trung tâm được thực hiện bởi các đối tượng, được liên kết với bốn mô hình: trừu tượng hóa, đóng gói, kế thừa, đa hình. C++ là ngôn ngữ được gõ mạnh, trong khi Objective-C được gõ yếu hoặc có hệ thống năng động Loại dữ liệu. Giống như Smalltalk, Objective-C gửi tin nhắn đến các đối tượng. Đây là một tính năng đặc biệt của ngôn ngữ động vì loại đối tượng được kiểm tra trong thời gian chạy thay vì lúc biên dịch.

Mô tả của ngôn ngữ Objective-C chiếm nhiều hơn một khối lượng lớn. Vì vậy, để có được kiến ​​thức khách quan thì nên tham gia khóa học “”. Toàn bộ phần của khóa học được dành riêng cho ngôn ngữ này.

Phát triển ứng dụng iOS

Để làm mẫu, chúng tôi sẽ phát triển một ứng dụng rất đơn giản. Chúng ta đừng đi chệch khỏi truyền thống thiêng liêng, chúng ta hãy chào đón thế giới. Tuy nhiên, có tính đến thực tế là chúng ta ứng dụng đồ họa, chúng tôi sẽ đa dạng hóa nó một chút: chúng tôi sẽ thêm một nút, khi nhấp vào, chúng tôi sẽ hiển thị hoặc ẩn dòng chữ “Xin chào, Thế giới”.

Khởi chạy Xcode, trong cửa sổ xuất hiện, chọn Tạo dự án mới hoặc trong menu chính Tệp -> Mới -> Dự án. Cửa sổ tiếp theo sẽ yêu cầu bạn chọn nền tảng đích và loại ứng dụng.


TRONG trong trường hợp này Chúng tôi quan tâm đến nền tảng iOS. Có bảy loại ứng dụng để lựa chọn. Sáu trong số đó là các mẫu dành cho các ứng dụng điển hình của hệ điều hành iOS, chứa một bộ thành phần khác theo mặc định. Loại thứ bảy là chơi đùa.

Các loại ứng dụng

  • Mẫu Ứng dụng Chế độ xem Đơn dành cho ứng dụng đơn giản với một màn hình. Giá trị đặt trước bao gồm thành phần Trình điều khiển Chế độ xem, cho phép bạn tùy chỉnh giao diện của ứng dụng bằng cách sử dụng trình thiết kế biểu mẫu Trình tạo Giao diện.
  • Ứng dụng chi tiết chính tạo ra một ứng dụng trong đó xem bảng một tập hợp các đối tượng được hiển thị. Sau khi chọn một trong số chúng, thông tin chi tiết về đối tượng đó sẽ được hiển thị. Cái nhìn đầu tiên là cái nhìn tổng thể, cái nhìn thứ hai là chi tiết.
  • Bằng cách sử dụng Ứng dụng dựa trên trang, bạn có thể tạo các ứng dụng có nhiều màn hình, giống như các trang trong một cuốn sách. Do đó, máy đọc sách điện tử được tạo ra từ chỗ trống này.
  • Ứng dụng theo thẻ cho phép bạn tạo các ứng dụng trong đó mỗi màn hình có thể được chuyển sang bất kỳ lúc nào, nghĩa là mỗi màn hình có một nút riêng để kích hoạt, trên đó tiêu đề được hiển thị. Một ví dụ là iTunes.
  • Trò chơi được sử dụng để tạo mẫu trò chơi. Có bốn khung để lựa chọn để tạo trò chơi: SpriteKit, SceneKit, OpenGL ES, Metal. Chúng ta hãy nhìn vào chúng một cách ngắn gọn.
    SpriteKit là một hệ thống hiển thị 2D và hoạt ảnh của các hình chữ nhật có kết cấu - các họa tiết. Khi hiển thị khung hình, một vòng lặp tiêu chuẩn được sử dụng, khung hình được hiển thị sau khi tất cả nội dung của cảnh đã được xử lý.
    SceneKit là một framework cấp cao để hiển thị đồ họa 3D không có OpenGL. Nó hỗ trợ tải, thao tác các đối tượng 3D. Nó bao gồm: một công cụ vật lý, một bộ tạo hạt và một phương pháp viết kịch bản dễ dàng.
    OpenGL ES là một tiêu chuẩn trong đồ họa máy tính. Cho phép bạn hình dung cảnh 2D và 3D. Cho phép bạn mô tả đường dẫn cho card màn hình: các đỉnh trải qua quá trình biến đổi, được tập hợp thành các nguyên hàm, được rasterized thành hình ảnh hai chiều và hiển thị trên màn hình. Các trình đổ bóng có thể lập trình có thể được đưa vào quy trình.
    Metal là một API cấp thấp cho phép bạn tận dụng tối đa sức mạnh từ bộ điều hợp video của mình. API được sắp xếp hợp lý, cùng với các trình đổ bóng được biên dịch sẵn và đa luồng, sẽ đưa trò chơi của bạn lên những cấp độ mới về hiệu suất và chất lượng.
  • Ứng dụng Gói Nhãn dán là một loại ứng dụng mới xuất hiện trong iOS 10 và Xcode 8. Nó là một tập hợp các hình ảnh đơn giản hoặc hoạt hình được sử dụng trong iMessage mới. Nó không yêu cầu mã hóa để tạo ra nó.
  • Ứng dụng iMessage là một loại ứng dụng mới xuất hiện trong iOS 10 và Xcode 8. Cho phép bạn tạo các tiện ích bổ sung cho iMessage, chẳng hạn như mua và tải xuống gói nhãn dán của bạn. Bạn cũng có thể sử dụng API iMessage để tạo ứng dụng tương tự của riêng mình cho ứng dụng này, bao gồm phát âm thanh, video, sử dụng nhãn dán, v.v.

Tạo dự án đầu tiên

Làm mẫu cho ứng dụng của chúng tôi, chúng tôi sẽ chọn Ứng dụng xem một lần. Vì chúng tôi sẽ không phát triển một chương trình lớn nên số tiền được cung cấp bởi điều khoản này sẽ đủ cho chúng tôi. Bấm tiếp. Trên trang tiếp theo của trình hướng dẫn, bạn cần nhập tên dự án, ví dụ ShowLab. Trong danh sách thả xuống Ngôn ngữ, hãy chọn ngôn ngữ mặc định - Objective-C. Tiếp theo, trong danh sách thả xuống Thiết bị, hãy để lại lựa chọn Phổ thông. Tại đây bạn xác định ứng dụng đang được tạo cho thiết bị nào (iPhone hoặc iPad). Mệnh đề phổ quát có nghĩa cho cả hai. Hãy bỏ chọn hộp Bao gồm các bài kiểm tra đơn vị và bao gồm các bài kiểm tra giao diện người dùng; chúng tôi không cần bất kỳ bài kiểm tra nào. Kế tiếp. Chọn một thư mục để lưu dự án. Bây giờ hãy nhấp vào nút Tạo.

Kết quả là một cửa sổ sẽ mở ra với danh sách tất cả các tham số được áp dụng cho dự án. Trong cửa sổ này, bạn có thể thay đổi các tham số đã đặt trước đó trong trình hướng dẫn: hướng, thiết bị đích, v.v.


Đầu tiên chúng ta cần tạo giao diện ứng dụng. Để thực hiện việc này, hãy chọn tệp Main.storyboard trong danh sách bên trái bằng một cú nhấp chuột (nếu tệp này không hiển thị, hãy mở rộng nội dung của thư mục ShowLab). Ở bên phải danh sách, toàn bộ cửa sổ sẽ được Trình tạo giao diện chiếm giữ. Bố cục thiết bị sẽ được hiển thị ở trung tâm. Ở góc dưới bên phải của cửa sổ có bảng thành phần. Kéo các thành phần Nhãn và Nút từ đó vào bố cục. Phía trên bảng thành phần là danh sách các thuộc tính. Nếu bạn không có nó, hãy nhấp vào nút Hiển thị Trình kiểm tra thuộc tính, nằm dưới tiêu đề cửa sổ ở bên phải giao diện.

Chọn thành phần Nhãn trong bố cục và định cấu hình thuộc tính Văn bản của nó: để nguyên lựa chọn Đơn giản trong danh sách thả xuống, nhập dòng chữ mong muốn vào dòng bên dưới, trong trường hợp của chúng tôi là “Xin chào, Thế giới”. Nếu văn bản không vừa với đường viền của nhãn, hãy thay đổi chúng bằng cách kéo tay cầm trên các cạnh của thành phần. Để tập trung nó theo chiều ngang, hãy truy cập trang Trình kiểm tra kích thước bằng cách nhấp vào nút Hiển thị Trình kiểm tra kích thước (ở bên phải Hiển thị Trình kiểm tra thuộc tính). Trên trang này, từ danh sách thả xuống Sắp xếp, chọn Căn giữa theo chiều ngang trong Vùng chứa.

Bây giờ hãy chọn thành phần Nút, thay đổi thuộc tính Văn bản của nó thành nhãn mong muốn - Chuyển đổi. Bạn có thể căn giữa nó theo cách tương tự như mô tả ở trên.

Tạo kết nối giữa các yếu tố đồ họa và mã

TRONG Visual Studio(hoặc Delphi) trong mã được tạo tự động ngay khi bạn đặt một thành phần trực quan vào biểu mẫu. Điều này không xảy ra trong Xcode nhưng nó không gây ra vấn đề gì.

Mở nội dung của tệp tiêu đề ViewController.h trong một cửa sổ riêng bằng cách nhấp đúp vào nó. Tệp này chứa phần khai báo phần mở rộng của lớp UIViewController, được đánh dấu bằng từ khóa @interface. Tính năng này đã được thêm vào phiên bản thứ hai của Objective-C. Bây giờ hãy thực hiện thủ thuật này: di chuyển con trỏ chuột đến một thành phần - nhãn văn bản, giữ phím Ctrl và nút chuột trái. Di chuyển con trỏ đến cửa sổ có mã (file ViewController.h), một dòng màu xanh sẽ theo con trỏ. Nhả chuột và phím bên trong mô tả giao diện ViewController.

Cửa sổ tạo Outlet sẽ xuất hiện.


Đây là thuộc tính của một đối tượng đề cập đến một đối tượng khác (trong trường hợp này là thành phần trực quan). Bạn cần nhập tên của đối tượng Outlet, qua đó bạn sẽ truy cập vào thành phần trực quan, hãy đặt nó là lab. Tiếp theo, loại đối tượng được chọn, nó được chọn chính xác: UILabel.

Thậm chí thấp hơn trong danh sách Lưu trữ, chọn loại tham chiếu đối tượng: yếu hoặc mạnh. Nếu bạn chọn mạnh thì đối tượng được trỏ tới bởi thuộc tính sẽ tồn tại miễn là thuộc tính trỏ tới nó, trong trường hợp đó nó sẽ không tự động bị xóa khi không còn được sử dụng. Mặt khác, khi tham chiếu yếu có hiệu lực, đối tượng có thể tự hủy. Vì vậy, hãy chọn loại liên kết yếu và nhấp vào nút Kết nối. Kết quả là dòng sau sẽ được thêm vào mã:

@property (yếu, không nguyên tử) IBOutlet UILabel *lab;

Hãy đảm bảo rằng Outlet là một tài sản.

Bây giờ hãy tạo một Outlet cho nút này. Thuật toán vẫn giữ nguyên. Chỉ riêng thuộc tính Name bạn cần nhập tên khác, ví dụ but. Dòng này sẽ được thêm vào mã:

@property (yếu, không nguyên tử) IBOutlet UIButton *nhưng;

Kết quả là, chúng ta có hai con trỏ tới các thành phần trực quan: lab và but - tương ứng, một dòng chữ và một nút. Bây giờ, bằng cách sử dụng con trỏ, chúng ta có thể thao tác các thành phần trong mã.

Sau đó, bạn cần tạo một trình xử lý sự kiện nhấn nút. Để thực hiện việc này, hãy mở tệp triển khai ViewController.m trong một cửa sổ riêng. Thực hiện tương tự như cách bạn kéo dòng vào tệp tiêu đề để tạo ổ cắm, từ nút, kéo dòng vào tệp triển khai và thả nó vào dấu ngoặc lệnh đóng - @end. Một cửa sổ tạo sự kiện sẽ xuất hiện, tương tự như cửa sổ tạo lối thoát. Bạn thấy sự khác biệt: một liên kết đến một đối tượng được tạo trong tệp tiêu đề, một phương thức được tạo trong tệp triển khai.


Điền vào trường Name, giá trị của nó đại diện cho tên của thuộc tính - phương thức. Hãy để nó ở trênClick. Để lại giá trị trường Loại làm mặc định - id. Trong Mục tiêu-C loại này là tổ tiên của mọi người khác. Trong danh sách thả xuống Sự kiện, sự kiện Touch Up Inside được chọn theo mặc định, xảy ra khi con trỏ (chuột, ngón tay...) được thả qua nút, tức là giai đoạn cuối cùng của việc nhấn nút. Đó là những gì chúng ta cần. Trong danh sách Đối số, chúng ta sẽ để giá trị mặc định: Người gửi là đối tượng đã gửi tín hiệu này, trong trường hợp của chúng ta nó sẽ luôn là một nút. Nhấp vào nút Kết nối. Kết quả là đoạn mã sau sẽ được thêm vào:

- (IBAction)onClick:(id)sender ( )

Dấu trừ ở đầu có nghĩa là phương pháp riêng(riêng tư). Từ khóa IBAction đánh dấu các sự kiện (phương thức) của các thành phần trực quan từ Trình tạo giao diện.

Giữa các dấu ngoặc lệnh, chúng ta sẽ viết mã được thực thi khi nhấn nút:

Lab.hidden = !_lab.hidden;

Trong dòng mã này, chúng tôi đảo ngược giá trị của thuộc tính ẩn. Nó thuộc loại BOOL, có hai giá trị: CÓ - đúng và KHÔNG - sai (hơi bất thường đối với các lập trình viên Windows, trong đó đúng và sai).

Hãy chú ý đến ký tự gạch dưới trước tên đối tượng - nhãn (_lab). Không có nó, việc biên dịch sẽ thất bại. Dấu gạch dưới được tự động thêm vào cho các đối tượng chứa trong các đối tượng khác; nghĩa là, trong trường hợp này, đối tượng lab được chứa trong đối tượng ViewController. Trước đây, đây là quy ước được sử dụng để phân biệt giữa các đối tượng được khai báo là thành viên của một lớp và các đối tượng cục bộ. Và bây giờ đây là một quy tắc nghiêm ngặt được triển khai trong trình biên dịch ngôn ngữ.

Bây giờ bạn có thể biên dịch ứng dụng và chạy nó trên trình mô phỏng. Chúng tôi đã chọn trình mô phỏng cho iPhone 7, có trong Xcode 8. Nút biên dịch và chạy là một hình chữ nhật màu đen và nằm trong thanh ở đầu giao diện.

Sau khi biên dịch ứng dụng, khởi chạy trình mô phỏng và tải ứng dụng của chúng tôi, giao diện của nó sẽ được hiển thị trên màn hình trình mô phỏng: dòng chữ “Xin chào, Thế giới” và nút Chuyển đổi. Nếu bạn nhấn nút cuối cùng, dòng chữ sẽ biến mất; nếu bạn nhấn lại, nó sẽ xuất hiện trở lại.

Chúng tôi đã tạo một ứng dụng rất đơn giản để hiểu bản chất của việc phát triển iOS. Bạn có thể tìm hiểu thêm thông tin chi tiết về cách tạo ứng dụng iOS trong Objective-C từ khóa học của những người bạn của chúng tôi từ GeekBrains “”. Khóa học dành hai tháng để học ngôn ngữ này. Trong tháng đầu tiên - các chủ đề giới thiệu và trong tháng thứ hai - mã hóa thực tế các ứng dụng chuyên nghiệp.

Ngôn ngữ Swift

Năm 2014, Apple giới thiệu ngôn ngữ lập trình mới - Swift. Nó nhanh chóng trở thành chủ đề được thảo luận nhiều nhất và năng động nhất phát triển ngôn ngữ trên thế giới. Nó đáng tin cậy, an toàn, trực quan ngôn ngữ rõ ràngđể phát triển ứng dụng cho hệ điều hành hệ thống macOS, iOS, tvOS và watchOS cho toàn bộ nhóm thiết bị Apple. Swift là một ngôn ngữ lập trình hiệu quả. Nó dễ học hơn so với người tiền nhiệm của nó, Objective-C và Swift mượn một số ý tưởng hay nhất của nó. Đồng thời, các nhà phát triển đã làm cho các ngôn ngữ trở nên tương thích, tức là một chương trình có thể chứa mã ở cả Swift và Objective-C. Có hàng tỷ dòng mã và hàng trăm nghìn chương trình kế thừa được viết bằng Objective-C trên thế giới, vì vậy sự hỗ trợ của nó chắc chắn sẽ không bị bỏ rơi.

Khi phát triển Swift, mục tiêu là tạo ra ngôn ngữ lập trình hệ thống thuận tiện nhất - nhanh chóng, an toàn và biểu cảm.

Thuật toán trong Swift nhanh hơn 2,6 lần so với thuật toán tương tự trong Objective-C và nhanh hơn 8,4 lần so với Python. Sử dụng Swift giúp quá trình phát triển chương trình trở nên linh hoạt và thuận tiện hơn.

Do sự phát triển theo cấp số nhân, ngôn ngữ Swift đã được phát hành cho cộng đồng nguồn mở vào ngày 3 tháng 12 năm 2015. Đồng thời, Apple giám sát chặt chẽ sự phát triển của mình, tổ chức một ủy ban cho sự phát triển của nó. Swift hiện không chỉ có sẵn trên các hệ thống của Apple mà còn có trên Linux. Tất cả các công cụ bổ sung để làm việc với ngôn ngữ, bao gồm trình gỡ lỗi, thư viện chuẩn, trình quản lý gói, cũng miễn phí và mở.

Ngôn ngữ này là tương lai. Bạn có thể tìm hiểu thông tin chi tiết hơn về nó từ khóa học được đề cập từ GeekBrains “”, trong đó dành cả tháng để học ngôn ngữ lập trình này.

Cửa hàng ứng dụng

Nói một cách đơn giản, App Store là cửa hàng nội dung dành cho toàn bộ các thiết bị Apple. Tại đây bạn có thể mua trò chơi và ứng dụng từ cả các công ty lớn và nhà phát triển độc lập. Mọi nhà phát triển, bất kể anh ta sống ở quốc gia nào, đều có thể bán hoặc phân phối chương trình của mình miễn phí trên nền tảng phân phối kỹ thuật số này. Để bắt đầu thực hiện việc này, bạn cần đăng ký làm nhà phát triển và mua giấy phép để bán ứng dụng của mình. Đây là khoản phí dành cho dịch vụ được cung cấp và sự phát triển của App Store.

Kết quả

Chúng tôi đã phát triển một ứng dụng đơn giản cho hệ điều hành di động iOS bằng hệ thống lập trình Xcode cùng với ngôn ngữ Objective-C. Chúng tôi đã thử nghiệm ứng dụng đã hoàn thiện trên trình mô phỏng iPhone 7. Chúng tôi đã học cách xây dựng. giao diện người dùng sử dụng Trình tạo giao diện, cách liên kết yếu tố đồ họa với mã ứng dụng, cách tạo trình xử lý sự kiện. Chúng ta đã làm quen với những điều cơ bản về Objective-C. Ngoài ra, chúng tôi đã thu hút sự chú ý đến ngôn ngữ Swift đầy hứa hẹn, được sử dụng để phát triển mạnh mẽ và ứng dụng an toàn cho hệ sinh thái “quả táo”.

Tuy nhiên, tài liệu được nghiên cứu chỉ là bước khởi đầu. Để nâng cấp bản thân một cách chuyên sâu theo hướng mã hóa di động và phát triển các ứng dụng bán hàng thực sự, chúng tôi khuyên bạn nên tham gia khóa học “” trên trang web của bạn bè.

Đây là một khóa học xứng đáng: sau khi tham gia, bạn chắc chắn sẽ không lãng phí thời gian của mình. Nó bắt đầu với hai khóa học chi tiết về ngôn ngữ Java, sau đó là học lập trình cơ bản cho hệ điều hành di động Android. Tiếp theo là khóa học về cơ sở dữ liệu nói chung và ngôn ngữ SQL nói riêng. Sau đó là khóa học chuyên sâu về phát triển ứng dụng Android chuyên nghiệp. Sau này, hướng nghiên cứu sẽ chuyển sang các hệ thống của Apple: hai khóa học chi tiết về ngôn ngữ Objective-C và một khóa học hữu ích về Swift.


Các bài giảng của khóa học được giảng dạy bởi các giáo viên chuyên nghiệp có nhiều kinh nghiệm trong lĩnh vực phát triển phần mềm. Nếu có điều gì chưa rõ, bạn có thể đặt câu hỏi ngay lập tức. Nói chung, học tập trên GeekBrains là một quá trình trực tiếp, bạn có thể giao tiếp, đặt câu hỏi và trợ giúp giải đáp. Để kiểm tra kiến ​​thức đã thu được, giáo viên giao bài tập về nhà, sau đó kiểm tra. Sau khi hoàn thành khóa đào tạo, bạn sẽ được đảm bảo thực tập tại một công ty CNTT. Và khi đó mọi thứ đều phụ thuộc vào bạn, nếu bạn thể hiện mình là một chuyên gia có năng lực, bạn sẽ được mời làm việc.

Dự án đặc biệt cùng công ty

triton Ngày 2 tháng 2 năm 2013 lúc 04:21

Objective-C là ngôn ngữ lập trình đầu tiên

  • Lập trình,
  • Mục tiêu C
  • Hướng dẫn

Bài đăng này được hình thành sau khi không tìm thấy câu trả lời rõ ràng cho một số câu hỏi quan trọng. Tôi không giả vờ là một lập trình viên giỏi. Không, mọi thứ vẫn còn ở phía trước, nhưng thời kỳ ủ bệnh đã qua rồi. Đây là một bài viết trong loạt bài “Nếu bạn không biết tự làm, hãy dạy người khác”. Ý tôi là, để hiểu điều gì đó tốt hơn, bạn cần phải giải thích điều đó cho ai đó. Chiếc xe máy không phải của tôi, tôi đã từng gặp cụm từ này trong các ấn phẩm trên Habré. Một số điều rất khó hiểu. Và những người hiểu thường không thể giải thích cho người mới bắt đầu. Có lẽ đây cũng là điều đang chờ đợi tôi. Nó giống như cuộc trò chuyện giữa một người lớn và một đứa trẻ. Gần như là một cuộc xung đột thế hệ. Cho đến khi trình độ của tôi phát triển thành chuyên nghiệp, tôi cần vạch ra tầm nhìn hiện tại của mình.

Trong bài viết, các thuật ngữ dùng để giải thích các khái niệm khác nhau được đặt trong dấu ngoặc kép. Bài viết này được viết dành cho những người đã học cách phân biệt vòng lặp với mảng và hiểu hàm và phương thức là gì.
Nếu bạn chưa bao giờ lập trình thì cuốn sách của Kernighan và Ritchie (ở bất kỳ ấn bản nào) rõ ràng sẽ vượt quá khả năng của bạn. Về bản chất không có sức mạnh ý chí nào có thể buộc bạn phải đọc hết một cuốn sách, đồng thời giải quyết được mọi vấn đề được đưa ra.
Tôi thực sự khuyên dùng BecomeAnXcode. Mọi thứ ở đó được viết khá rõ ràng cho những người biết rất ít về lập trình. Thông tin hơi lỗi thời nhưng nó sẽ giúp ích cho bạn khi bắt đầu. Có thể bạn đã xem qua nó, hoặc thậm chí bạn đã tải nó xuống, nhưng hãy cất nó vào danh mục tài liệu (à, ai cũng có một danh mục như vậy, nó chiếm hàng chục gigabyte và chúng ta sẽ đọc tất cả. điều này ngay khi chúng ta có thời gian rảnh và danh mục ngày càng phát triển... ).
Rõ ràng là lựa chọn tốt nhất- MAC. Tệ nhất - Hackintosh hoặc máy ảo. Và ngay cả khi bộ xử lý không cho phép bạn chạy bất kỳ thao tác nào ở trên, bạn có thể bắt đầu trực tiếp trong notepad, sau đó là biên dịch trên dòng lệnh.
Trên nhiều diễn đàn, bạn có thể tìm thấy một câu hỏi phổ biến được hỏi bởi những người dường như đang ở trong một chiếc xe tăng bọc thép hạng nặng: “Lập trình viên Objective-C có cần học C không?” Ở đâu họ cũng viết những điều giống nhau. Những người có râu và bắt đầu với lập trình có cấu trúc- họ nói rằng bạn chỉ cần trở thành ít nhất một MiddleDeveloper trong C, và chỉ sau đó tìm kiếm một con đường trong vùng hoang dã khốc liệt của OOP, đó là Objective-C. Những người không biết C, nhưng bằng cách nào đó đã đạt được trạng thái MiddleDeveloper. Họ phản đối: họ nói, hãy tìm hiểu cách vẽ các nút trên iPhone và cách gán chức năng cho chúng, sau đó phần cứng sẽ được điều chỉnh khi cần thiết. Tôi dứt khoát tuyên bố rằng việc học cách gán các chức năng cho các nút không phải là lập trình! Tôi không ủng hộ việc dành sáu tháng để hiểu C thuần túy. Nhưng việc dành một vài tuần hoặc một tháng là đáng giá. Điều này sẽ cung cấp một số nền tảng cho tham vọng của bạn. Khi bạn học Objective-C, các cấu trúc mã chắc chắn sẽ phát sinh và không có gì rõ ràng. Vì vậy, tôi đề xuất, không hề cuồng tín mà hãy tự làm quen một cách chi tiết với cuốn sách của A.B. "Học C." Nó lớn hơn cuốn trước gấp 3 lần về số lượng nhưng đọc dễ dàng và tự nhiên. Cuốn sách một lần nữa giải thích những kiến ​​thức cơ bản về lập trình ở mức độ khá dễ tiếp cận. Trong đó bạn có thể tìm hiểu cách phân biệt một mảng với một vòng lặp và con trỏ là gì.
Gần đây, một bài báo lóe lên trên Habré, trong đó tác giả trích dẫn một loạt tài liệu mà ông khuyên nên đọc và đi làm đàn em để kiếm cơm. Nếu bạn chỉ đọc tất cả tài liệu trong bài viết đó, bạn sẽ không học được gì, nhưng nếu bạn có thể giải lại và ghi nhớ tất cả tài liệu một lần nữa, thì bạn sẽ không thể trở thành một thiếu niên mà là một nhà phát triển được kính trọng.

Bắt đầu: phương thức lớp và phương thức cá thể

Phương pháp là gì? Đây là một tập hợp các lệnh/hướng dẫn hoặc một lệnh/lệnh có thể được áp dụng cho một đối tượng và tạo ra các quy trình cần thiết trong đó. Nếu điều này chưa hoàn toàn rõ ràng, hãy đọc tiếp và bạn sẽ hiểu. Trong thực tế, rất khó để hiểu phương thức lớp và phương thức cá thể là gì. Mọi người đều nói: “có dấu “+” là phương thức lớp, nhưng có dấu “-” là phương thức thể hiện. Rõ ràng?" Và để đáp lại, họ nghe thấy: “Có, một phương thức lớp và một phương thức phiên bản.” Cá nhân tôi lúc đầu chỉ hiểu rằng chúng khác nhau, nhưng sử dụng cái gì và khi nào thì vẫn chưa rõ ràng. Wikipedia liên tục lặp lại những điều tương tự mà chúng ta đã nghe và đọc.
Trong phần lớn các trường hợp, bạn sẽ làm việc với các phương thức phiên bản.
Vì vậy, phương pháp instance. Hãy tưởng tượng rằng chúng ta có một chương trình trong đó chúng ta sẽ sử dụng 2 lớp: Primus và Kitchen.
Bất kỳ lớp nào (trừ lớp trừu tượng) đều có các phương thức và/hoặc hàm. Một lớp có thể có một số phương thức có dấu "+" ở phía trước tên phương thức (phương thức lớp) và một số phương thức có dấu "-" ở phía trước tên phương thức (phương thức phiên bản). Đây là những phương thức mà chúng tôi tích cực sử dụng với dấu “-” liên quan đến các đối tượng - các thể hiện của lớp và chính lớp đó. Và các phương thức có dấu "+" chỉ có thể được áp dụng cho chính lớp nơi phương thức này được khai báo.

Một thể hiện của một lớp là gì?

Nghe có vẻ tự hào, nhưng nó không rõ ràng. Ai nhớ từ khóa học: Trong hình học, một điểm là cha của một hình tròn, đường thẳng và các hình dạng khác, vì mỗi hình bao gồm nhiều điểm.
Một lớp dành cho Objective-C, trên một số tài nguyên, nó được hiểu là một đối tượng và ngược lại. Thực ra thì có hơi lệch một chút. Chúng ta có thể nói rằng một đối tượng là một thể hiện của một lớp. Là một ví dụ cụ thể về một con mồi đứng trong nhà bếp của bạn, nó là một bản sao của loại “Primus”: có núm vặn, đầu đốt, v.v. Đây không chỉ là một con mồi - nó là con mồi của bạn. Lớp học là một tấm gương để noi theo. Một ví dụ mẫu về một thứ cũng có thể thực hiện một số chức năng nhờ các phương thức lớp (có dấu “+”). Bạn có thể đọc nó chi tiết hơn một chút.
Ngoài ra còn có “giao thức” và “lớp trừu tượng”. Ở đây mọi thứ thú vị hơn nhưng ngưỡng hiểu biết cao hơn ngưỡng hiểu của một lớp và một đối tượng. Sự khác biệt là một “giao thức” không thể có một lớp con hoặc một đối tượng con không kế thừa từ nó, nó phải tuân theo nó. Là yêu cầu khi tuyển dụng. Ứng dụng các giao thức trong đời thực Tôi sẽ đề cập đến trong bài viết này. Lớp trừu tượng là một thực thể giống như một lớp, nhưng không hẳn là một lớp cụ thể và do đó có tính trừu tượng. Ví dụ: một lần nữa, Primus tại nhà của bạn là một phiên bản của lớp “Primus” chứ không phải lớp “Thiết bị sưởi ấm” trừu tượng nào đó. Bạn không thể có một thiết bị sưởi ấm ở nhà nếu không có gia tộc và bộ tộc (nó cũng có thể là lò sưởi và bộ tản nhiệt). Do đó, lớp “Primus” có thể là lớp kế thừa của lớp “Thiết bị sưởi ấm” trừu tượng. Và con mồi của bạn là một ví dụ về định nghĩa cụ thể của con mồi. Và đối với các thuộc tính của nó - thuộc tính, phương thức, giao thức, khi được sử dụng, nó sẽ chuyển sang lớp của nó và kiểm tra xem nó có thể làm gì, không thể làm gì và thậm chí nó có thể có những gì.
Hãy tưởng tượng rằng có một lớp nhất định “Gas burner” - người thừa kế của lớp trừu tượng “Thiết bị sưởi ấm”. Lớp “Gas burner” sẽ là lớp cha của “Primus” và “Gas Stove”. Để tiến gần hơn đến lập trình, bạn cần trừu tượng hóa một chút.
Objective-C có lớp cha NSObject. Trong ngôn ngữ lập trình, nó giống như một điểm trong hình học. Cái này lớp học hoàn hảo: không có gì thừa trong đó, nó không có gì cụ thể, nhưng bạn có thể tạo bất cứ thứ gì từ nó. Đây là khối xây dựng của vũ trụ. Nếu bạn giữ nút “Command” trong Xcode và nhấp vào NSObject, nội dung của tệp NSObject.h sẽ mở ra trước mặt bạn. Nó chứa khoảng 200 dòng mô tả các phương pháp khác nhau. Có những phương thức có dấu “+” ở phía trước tên, cũng như các phương thức có dấu “-”. Bản chất của các phương thức có dấu "+" là chúng chỉ có thể được áp dụng trực tiếp cho chính NSObject. Phương pháp này là, ví dụ,

+(id) phân bổ;
và bạn chỉ có thể sử dụng nó như thế này:

;
Theo định nghĩa, bất kỳ đối tượng nào khác trong Objective-C đều là hậu duệ của NSObject. Nó thực hiện phương pháp bổ sung, điều đó mang lại cho anh ta những nét tính cách. Giả sử đây là NSResponder. Hậu duệ này - NSResponder - cũng có thể có các đối tượng con. Ví dụ UIView. Xa hơn về cây kế thừa, bạn có thể lấy UIScrollView làm ví dụ. Sau đó - UITableView. Trong mỗi trường hợp, con cháu có được chức năng bổ sung. Ngoài việc họ biết cách làm một việc gì đó của riêng mình, họ có thể làm mọi thứ mà tổ tiên của họ có thể làm. Chuyện là thế đấy - di sản.
Nếu bạn không muốn lớp con của mình sao chép hoàn toàn hành vi của lớp cha thì bạn có thể làm lại bất kỳ phương thức nào của lớp cha theo ý thích của mình. Đây là - tính đa hình.
Trong các chương trình của mình, bạn sẽ chọn lớp bạn cần và thêm các phương thức cần thiết vào đó - mở rộng chức năng của nó. Bạn cũng có thể lấy lớp bạn đã tạo và tạo lớp con của nó, mở rộng lại chức năng và đồng thời tạo ra một công cụ duy nhất để giải quyết vấn đề mong muốn. Cơ chế được mô tả được gọi là tạo ra các lớp con.
Tôi sẽ không đi sâu vào mô tả rộng rãi về các phương pháp có dấu “+”. Sẽ rõ ràng hơn khi chỉ ra rằng việc áp dụng phương pháp

+(id) phân bổ;
đối với bất kỳ lớp hoặc lớp con nào, hãy phân bổ lượng bộ nhớ cần thiết trong RAM của máy tính cho lớp đó.


Ứng dụng của phương pháp

-(id)init;
khởi tạo đối tượng, phân bổ không gian cho nó trong RAM và sau đó đối tượng bắt đầu tồn tại và có thể được làm việc.


2 phương thức này ("alloc" và "init") vừa tạo một "đối tượng" đối tượng. Và đối tượng đã cho là một thể hiện của một đối tượng hoặc một thể hiện của lớp NSObject. Nếu bạn áp dụng các phương pháp này một cách riêng biệt

NSObject *object = ; ;
thì đối tượng cũng sẽ được tạo. Nhưng có một khả năng khác 0 là bạn sẽ tạo sai đối tượng mà bạn đã cấp phát bộ nhớ. Giả sử gọi một phương thức

NSObject *object = ;
được phân bổ một địa chỉ như vậy trong bộ nhớ cho nó

0x000000000
Điều này xảy ra vì trong quá trình khởi tạo, môi trường thời gian chạy đặt tất cả các đối tượng về giá trị “nil” để tránh tham chiếu đến vị trí bộ nhớ chứa đầy “rác”. Hoặc tham chiếu đến một đối tượng cụ thể khác, trên thực tế cũng đã là “rác”, vì nó đã hoàn thành vòng đời và không còn được “lưu trữ” trong bộ nhớ nữa mà chỉ đơn giản là được “định vị”. Để hiểu “rác” là gì, hãy tạo một chương trình đơn giản trong đó bạn khai báo

Int tôi;
mà không gán giá trị cho nó, sau đó in giá trị của nó ra bàn điều khiển

NSLog(@"%i", i);
Bạn sẽ ngạc nhiên về giá trị của chữ "i" của bạn.
Một thể hiện của đối tượng "isa" cũng sẽ được tạo, điều này sẽ được thảo luận sau. Đây là con trỏ không null duy nhất khi tạo đối tượng của bạn. Giả sử đây là một luồng tới một đối tượng cha, nó sẽ tạo ra phiên bản riêng của nó và mang lại sự sống cho đối tượng của chúng ta.
Về mặt lý thuyết, đối tượng đã tồn tại sau khi áp dụng phương thức “alloc”. Nhưng anh ấy sẽ không thể vượt qua bài kiểm tra

Nếu (! Tự)( ... )
Một đoạn mã như vậy có thể được nhìn thấy trong bất kỳ đối tượng mẫu nào trong phương thức “init” hoặc các dẫn xuất của nó.
Trong trường hợp này, đối tượng dường như tồn tại, nhưng về nguyên tắc nó bằng “nil”. Một đối tượng chưa được khởi tạo giống như một chiếc ô tô mà bạn sắp mua bằng thẻ tín dụng. Có vẻ như vậy nhưng nó không phải của bạn. Và nếu không rời khỏi máy tính tiền, hãy sử dụng phương thức “init”

NSObject *object = [init];
sau đó “Bingo!”, và đồ vật đó thuộc về bạn, bạn có thể làm bất cứ điều gì bạn muốn với nó. Nhưng nếu bạn áp dụng phương pháp này

;
sau đó một đối tượng khác có thể được khởi tạo. Có vẻ như bạn đã trả hết khoản vay mua một chiếc ô tô, nhưng hóa ra đó là nhầm chiếc ô tô và thay vì một chiếc ô tô, họ lại đưa cho bạn một chiếc ô tô khác. Thoạt nhìn chúng không thể phân biệt được với nhau. Nhưng họ có số “VIN” khác nhau, nghĩa là khi kiểm tra tại đồn cảnh sát giao thông bạn sẽ được thông báo xe không phải của bạn. Một lời giải thích mở rộng về hiện tượng này sẽ được đưa ra dưới đây.
Như bạn đã hiểu, phương thức “+alloc” là một phương thức lớp và phương thức “-init” là một phương thức thể hiện.
Hãy để tôi cho bạn một ví dụ với những điều thực tế.
Việc thực hiện đầy đủ phương pháp thường bao gồm 2 tệp có phần mở rộng *.h và *.m. Có thể có một con số khác, tùy thuộc vào loại lớp học và mục tiêu mà nó theo đuổi.
Có một lớp “Primus” trong chương trình của bạn. Các phương thức sau được khai báo trong tệp Primus.h:

Nguyên thủy. h //phương thức lớp, chỉ có thể áp dụng cho lớp "Primus" +(Primus *) hotAsHell; //phương thức cá thể, khởi tạo một cá thể của lớp "Primus" // phương thức cá thể, đặt các tham số ngọn lửa // phương thức cá thể, nhưng ứng dụng của nó cho lớp hiện tại gọi một cá thể của một đối tượng hoàn toàn khác -(MasterPoRemontu *) masterPoRemontuWithServiceItems: (NSArray *)i dịch vụSkills: (NSArray *)s;
Chương trình cũng có một lớp “Kitchen”, trong đó các phương thức sau được khai báo trong tệp “Kitchen.h”:

Kitchen.h //phương thức lớp, tạo một thể hiện của đối tượng "Kitchen" và áp dụng trực tiếp cho đối tượng "Kitchen" +(Kitchen *) KitchenFurniture:(NSArray *)furniture otherDishes:(NSArray *)dish; //phương thức instance, áp dụng nó vào nhà bếp gọi một thể hiện của đối tượng khác -(UkrainianBorsch *) borschWithIngredients:(NSarray)ingredients casserolAndPan:(NSArray)pan;
Trong các tệp “Primus.m” và “Kitchen.m”, tất cả các phương thức đã khai báo đều phải được triển khai, nghĩa là được mô tả: cách thức và điều gì xảy ra trong mỗi phương thức.
Nếu bạn định tạo một thể hiện của một đối tượng của một lớp khác trong bất kỳ lớp nào, thì trong tiêu đề, bạn sẽ cần nhập tệp *.h của đối tượng đã tạo, ví dụ: trong tiêu đề của tệp Kitchen.h chúng ta se viêt

#import "Primus.h"
Nghĩa là, có thể tạo lớp “Primus” bên trong lớp “Kitchen”.
Vì chúng tôi đã nhập tệp tiêu đề Primus.h vào tệp “Kitchen.h”, nên trong lớp “Kitchen”, các phương thức của phiên bản lớp “Primus” được khai báo trong tệp Primus.h sẽ có sẵn cho chúng tôi. Chúng có thể được áp dụng cho một lớp hoặc cho một thể hiện của lớp Primus.
Trong tệp Primus.m, bạn phải triển khai tất cả các phương thức đã được khai báo trong tệp Primus.h, nhưng bạn cũng có thể triển khai bất kỳ phương thức nào không được khai báo trong tệp tiêu đề Primus.h. Phương thức này sẽ chỉ có thể truy cập được từ trong lớp và không thể được gọi từ một lớp khác trong chương trình. Bạn cũng có thể tạo các biến bên trong tệp Primus.m - chúng cũng sẽ không có sẵn để sử dụng bên ngoài. Họ chỉ đơn giản là không biết về họ. Đó là lý do tại sao tệp *.h được gọi là giao diện lớp. Chỉ những gì được nêu rõ ràng trong đó mới có thể truy cập được từ bên ngoài vào lớp trong đó #import "Primus.h" được viết. Việc không thể tiếp cận các phương thức và biến đối với các phần khác của chương trình được gọi là - đóng gói.

Đầu tiên, hãy tạo một thể hiện của lớp "Primus" bên trong lớp "Kitchen"


Như bạn có thể thấy, chúng tôi đang gửi phương thức có "+" không phải đến một phiên bản của lớp "myPrimus" mà trực tiếp đến lớp "Primus". Một phiên bản của lớp "Primus" có tên "myPrimus" đã được tạo. Trong tương lai, các phương thức từ “Primus.h” có dấu “-” sẽ được áp dụng cho một phiên bản của lớp “myPrimus”. Và nếu chúng ta muốn tạo một phiên bản mới của lớp “Primus”, chúng ta có thể sử dụng lại phương thức “+hotAsHell”. Ngoài ra trong lớp "Primus" còn có một phương thức

-(id) initWithGas:(Gas *)nhiệt độ khí:(NSInteger)t;
Thông thường, tất cả các phương thức có tên bắt đầu bằng “init” đều thực hiện tương tự như phương thức “init” của lớp NSObject, chỉ với các khả năng mở rộng. Và trong trường hợp này, sử dụng phương thức “init” từ góc độ này

Primus *myPrimus = [ initWithGas:Nhiệt độ Propan:750];
sẽ tạo một đối tượng lớp Primus mới với những đặc điểm độc đáo.
Trong ví dụ vừa mô tả, một phương thức có đối số đã được sử dụng. Trong trường hợp cụ thể này, nó được sử dụng để tạo một thể hiện của lớp “Primus” với đặc điểm nhất định. Từ tên của các đặc điểm, rõ ràng phiên bản này của lớp Primus sẽ hoạt động bằng khí Propan và ở nhiệt độ 750 độ.
Lưu ý rằng tên phương thức trong Objective-C khá có ý nghĩa. Đôi khi bạn sẽ ngạc nhiên trước tiêu đề 10 từ của họ, nhưng điều này sẽ giúp bạn hiểu rõ hơn những gì được viết. Nói một cách đại khái, mã hóa ra là tự ghi lại tài liệu. Tất nhiên điều đó không loại trừ nhu cầu viết bình luận. Nhưng nếu bạn đặt ra quy tắc là tạo các phương thức của riêng mình, tên của phương thức này sẽ mang tải ngữ nghĩa và liên quan đến việc tạo các biến theo cách tương tự, thì số lượng nhận xét trong mã có thể giảm đáng kể.
Không giống như một số ngôn ngữ lập trình khác, các phương thức trong Objective-C không được gọi mà được gửi đến các đối tượng. Vì vậy, ngôn ngữ này ám chỉ “ngôn ngữ hướng thông điệp”; trong tiếng Nga nghe có vẻ không quá nghiêm ngặt nên tôi không cung cấp bản dịch.
Cũng lưu ý rằng tất cả các phương thức, sau khi gửi đến một đối tượng, tạo (trả về) một đối tượng mới đều có dấu ngoặc đơn sau “+” hoặc “-” tên cụ thể của đối tượng mà phiên bản của nó sẽ trả về hoặc “id”. Nghĩa là, dựa vào đối tượng nào được chỉ định trong ngoặc ngay sau dấu “+” hoặc “-”, chúng ta có thể phán đoán mình sẽ nhận được gì sau khi gửi phương thức này. "id" là gì? Đây là một loại đối tượng có thể mang hình dạng (loại) của bất kỳ đối tượng nào khác. Giả sử đây là loại đối tượng "yếu". Không phải theo nghĩa là có điều gì đó “yếu” đối với anh ta. Nếu chúng ta nói theo những thuật ngữ được chấp nhận rộng rãi thì đây là một đối tượng được đánh máy yếu. Sự hiện diện của những đối tượng như vậy trong một ngôn ngữ làm cho nó được đánh máy yếu.
Bạn cũng có thể tìm thấy loại “void” trong cùng các dấu ngoặc này.

"vô hiệu" là gì?

Mọi người đều nói: “Đây là lúc một phương thức không trả về gì cả”. Tại sao nó lại cần thiết? Sử dụng loại phương pháp này vẫn tạo ra các thao tác với các đối tượng, cấu trúc và số. Ngoài ra, các đối tượng và đại lượng vô hướng được bao gồm trong nó dưới dạng đối số có thể thay đổi hoặc biến mất hoàn toàn. Tất cả phụ thuộc vào những gì được thực hiện bên trong mỗi phương pháp cụ thể. Thực tế là “void” không trả về bất cứ thứ gì... mới. Như đã nói, các đối số có trong nó có thể tự thay đổi hoặc ảnh hưởng đến các đối tượng khác được thao tác trong phương thức bằng “void”. Nó thậm chí có thể tạo các đối tượng mới bên trong chính nó, nhưng không có gì được trả lại rõ ràng cho bên ngoài. Thông thường, một phương thức trả về thứ gì đó có từ khóa "return" ở cuối. Nhưng một phương thức như “void” không có “return” ở cuối. Anh ta có thể đặt nó bên trong các vòng lặp hoặc điều kiện của riêng mình để có thể ngắt chúng đúng lúc. Nhưng không phải ở cuối. Phương thức này không tạo ra bất cứ điều gì mới về cơ bản; nó chỉ đơn giản làm việc với một con trỏ tới một số đối tượng (số, mảng, ô, v.v.), thay đổi dữ liệu tại địa chỉ này hoặc sử dụng nó để tính toán dữ liệu khác mà nó gán cho các đối tượng khác.

"tự" là gì?

Từ này rất thường được sử dụng ở bất cứ đâu. Chính việc sử dụng nó ở mọi nơi sẽ gây ra sự nhầm lẫn trong kho kiến ​​thức có trật tự của bạn.
Hãy quay trở lại lớp Primus và Kitchen. Chúng ta hãy lấy một phương thức cụ thể của lớp “Primus” và xem xét việc triển khai nó sẽ như thế nào trong tệp “Primus.m”. Ví dụ đây là một phương pháp.

-(void) doFireWithGas:(Gas *)gas;
có thể được thực hiện theo cách này:

-(void) doFireWithGas:(Gas *)gas ( id myPrimus; if (!self)( myPrimus = ; ) ... ... ... )
Các dấu ngoặc nhọn là nơi diễn ra việc triển khai hoặc “triển khai” phương thức. Trong trường hợp này, việc triển khai phương thức sẽ như sau: nếu không phải myPrimus thì hãy thực thi lệnh

;
lần lượt có nội dung: tự khởi tạo bằng gas: nhiệt độ khí: 750. Nghĩa là, phương thức được gửi đến chính nó chứ không phải đến một đối tượng nào khác. Trong trường hợp này, “self” là lớp “Primus”, vì phương thức này nằm trong lớp “Primus”. Khai báo của nó nằm trong tệp Primus.h và cách triển khai nó nằm trong tệp Primus.m.
Bạn cũng có thể nhận thấy rằng phương thức này không trả về bất cứ thứ gì “void”. Đó là, nó hóa ra là một cách chơi chữ: nếu không có nguyên mẫu, thì chúng ta tạo ra nó, nhưng nó không thoát ra khỏi phương thức. Tại sao tạo ra nó sau đó? Giả sử chức năng của nó được triển khai như thế này:

Id myPrimus; if (!self)( myPrimus = ; ) MasterPoRemonty *master = ; )
Và ở đây rõ ràng là ở đâu đó bên trong phương pháp này, một người thợ sửa chữa nguyên thủy đã xuất hiện.
Tại sao dấu chấm than "!" được sử dụng? trong ngoặc đơn sau "nếu"? Trong lập trình, đây là một dấu hiệu tiêu cực. Nghĩa là, "!=" nghe có vẻ như "không bằng". Phương pháp điều kiện này thuận tiện do tính ngắn gọn của nó. TRONG trong ví dụ này có thể sử dụng một điều kiện có cấu trúc khác mang chức năng tương tự.

Nếu (myPrimus == nil)()
Điều kiện này dài gấp đôi và bạn cần phải đọc cả dòng mới hiểu được. Điều kiện này tuy nhỏ nhưng nếu bạn cần viết một cái gì đó như thế này

Nếu ((myPrimus == nil || yourPrimus == nil) && (mamaPrimus == nil || papaPrimus == nil))()
thì cấu trúc này

Nếu ((!myPrimus || !yourPrimus) && (!mamaPrimus || !papaPrimus))()
sẽ ở một vị trí thuận lợi hơn, cả về tính ngắn gọn và Kích thước vật lý. Việc xây dựng trước đó là tầm thường và có thể đơn giản là không vừa với một dòng.
Chúng ta hãy xem việc triển khai phương pháp này sẽ như thế nào trong lớp “Nhà bếp”. Trong tệp Kitchen.m, phương pháp tương tự sẽ được triển khai như sau:

-(void) doFireWithGas:(Gas *)gas ( Primus *myPrimus; if (!myPrimus)( Primus *myPrimus = ; ) MasterPoRemonty *master = ; ... ... )
Có thể thấy ở đây bạn cần chỉ ra đối tượng nào sẽ được tạo, thể hiện của nó sẽ được gọi là gì, sau đó gửi phương thức trực tiếp đến lớp cha.
Nghĩa là, từ khó “tự” được sử dụng bên trong lớp, như thể bạn đã tạo một phiên bản của nó.

Primus *myPrimus;
và truy cập một thể hiện của lớp. Bí quyết duy nhất là bạn không tạo bất kỳ thứ gì và bạn không truy cập vào phiên bản đó mà trực tiếp vào lớp. Để rõ ràng, tôi đã tạo một đối tượng

Id myPrimus;
có thể được truy cập bằng một phương thức. Nhưng không thể tạo ra nó mà có thể triển khai một cấu trúc phức tạp hơn có thể thực hiện các chức năng tương tự

Nếu (!self)( MasterPoRemonty *master = [ masterPoRemontuWithServiceItems:someItemsArray serviceSkills:someSkillsAray]; )
Để hiểu liệu bạn có thể viết “self” hay không, chỉ cần tưởng tượng phương thức nào bạn muốn gửi đến đối tượng và bắt đầu nhập từ “self”, nhưng không hoàn toàn, chẳng hạn như “sel”. Xcode sẽ cung cấp một số tùy chọn, trong số đó sẽ có “self”. Ở bên trái của nó sẽ có mô tả về lớp đó. Nếu đây chính xác là lớp mà bạn muốn gửi phương thức mong muốn (lớp mà bạn hiện đang thực hiện hành động), thì hãy sử dụng “self”. Nếu Xcode chỉ ra rằng “self” không phải là đối tượng bạn cần thì hãy sử dụng tên của lớp hoặc phiên bản bạn cần.
Rõ ràng là có sự tranh luận ở đây. Mỗi đối số có một loại, cũng được mô tả trong dấu ngoặc đơn nhưng sau dấu hai chấm. Sau dấu ngoặc đơn với loại đối số là tên của đối số. Nếu có dấu "*" trong ngoặc đơn sau loại đối số thì đó là một đối tượng. Nếu không có dấu "*" thì đây loại vô hướng, chẳng hạn như "NSInteger", về cơ bản là một "int" đơn giản. Ngoài ra, "NSInteger" có thể có dấu "*" cho đối số được truyền. Trong trường hợp này, chúng ta sẽ không thay đổi chính biến đó mà thay đổi con trỏ tới biến đó. Chủ đề về Chỉ mục nằm ngoài phạm vi của bài viết này. Tên của đối số trong phương thức này

-(void) doFireWithGas:(Gas *)gas;
sẽ nghe giống như "khí". Bạn có nhận thấy rằng việc triển khai không sử dụng tên thông thường cho gas không? Ví dụ: "Propan". Thực tế là đối số “khí” truyền tải tên cần thiết của khí. Ở đâu? Chúng tôi đã xem xét cách thực hiện phương pháp này

-(void) doFireWithGas:(Gas *)gas;
Nó liên quan đến một phương pháp

-(id) initWithGas:(Gas *)nhiệt độ khí:(NSInteger)t;
Phương thức này có 2 đối số "gas" và "t". Khi gửi phương thức đến đối tượng, chúng tôi đã chỉ ra nhiệt độ và chỉ cần sao chép loại khí từ phương thức

-(void) doFireWithGas:(Gas *)gas;
Tức là phương pháp này cũng được gửi đi đâu đó. Chúng ta hãy xem xét kỹ hơn về phương pháp

(Primus *) hotAsHell;
Việc thực hiện nó có thể trông như thế này

+(Primus *) hotAsHell( self = ; if (self)( ; ) return self; )
Lưu ý ý nghĩa của đối số "propanButan" được gửi. Chính điều này đã được truyền khắp lớp, từ phương thức này đến phương thức khác.
Bạn cũng có thể thấy ở đây rằng phương thức này được gửi đến đối tượng trong những điều kiện nhất định.
Bạn cần biết rằng không có phương pháp nào của bạn có thể tự hoạt động. Anh ấy cần một cú đá từ bên ngoài. Khi một nút được nhấn, một sự kiện xảy ra hoặc một sự kiện xảy ra, nó phải được kích hoạt bằng một phương thức giao thức mà bộ thực thi chạy vào thời điểm nó cần. Phương thức “hotAsHell” này chỉ được gửi sau một cuộc gọi rõ ràng, nó không phải là một phương thức hệ thống, nó cũng phải được đăng ký ở đâu đó hoặc được gán cho một cái gì đó.
Bây giờ chúng ta hãy xem phương pháp

-(id) initWithGas:(Gas *)nhiệt độ khí:(NSInteger)t;
Nó bao gồm kiểu trả về, kiểu đối số, đối số và bộ chọn. Bộ chọn là phần còn lại của một phương thức khi loại đối tượng được trả về, loại đối số và đối số bị lấy đi khỏi nó.

InitWithGas: nhiệt độ:
với dấu hai chấm. Nếu không có đối số thì cũng không có dấu hai chấm, như trong trường hợp “hotAsHell”. Thường thì bạn sẽ phải đối mặt với nhu cầu sử dụng bộ chọn. Bây giờ bạn biết những gì để ăn.
Khái niệm “siêu” được sử dụng cao hơn một chút.

"siêu" là gì?

Hãy xem xét phương pháp “hotAsHell” được triển khai ở trên. Nó có thiết kế này

Bản thân = ;
Đây là cách thông thường để khởi tạo một lớp con - thông qua việc khởi tạo lớp cha.
Giả sử rằng lớp "Primus" là hậu duệ trực tiếp của lớp "NSObject". Lớp đứng trong hệ thống phân cấp ngay phía trên lớp mà chúng ta đang làm việc có quyền được gọi là “siêu”. Đội

;
Gọi phương thức init của phiên bản NSObject. Nghĩa là, một thể hiện của tổ tiên của tất cả các đối tượng - NSObject - được tạo tự động, với các tham số mặc định (hoàn toàn là của NSObject). Gửi phương thức "init" NSObject"y trả về "self" từ NSObject"a. của NSObject"a chính nó. Và phiên bản này được gán cho đối tượng “Primus” của chúng tôi. Suy cho cùng, “bản thân” trong trường hợp này chính xác là “Primus”. Và ở giai đoạn này, chúng ta có một phiên bản của đối tượng “Primus”, không khác gì NSObject. Tiền đề phương pháp của chúng tôi mang lại cho nó những đặc điểm riêng biệt

;
cũng như các phương thức khác được triển khai trong lớp này.
Thiết kế

Nếu (tự) (...)
đây chỉ là tái bảo hiểm trong trường hợp có sự cố xảy ra và Primus mặc định không được tạo. những thứ kia. phương thức init của lớp cha sẽ không được thực thi. Trong trường hợp này, họ thường làm

Khác (...)
nơi họ đang cố gắng khắc phục tình hình, nhưng thật không may, trường hợp này không xảy ra và “cái khác” sẽ không giúp ích được gì cho chúng tôi nữa.
Và ở đây tôi muốn nhắc các bạn về đối tượng chưa được khởi tạo từ đầu bài. Khi một thể hiện đối tượng được khởi tạo bởi siêu lớp của nó thì một vị trí bộ nhớ sẽ được gán cho nó và một con trỏ tới vị trí bộ nhớ này sẽ được truyền. Và khi chúng tôi kiểm tra

Nếu (tự = )
thì chính lúc này “bản thân” có thể nhận được một địa chỉ không mong đợi trong bộ nhớ. Tức là con trỏ kết quả sẽ không còn là “self” nữa. Superclass sẽ không trả lại cho chúng ta thứ gì đó khác thường. Phiên bản đối tượng sẽ giống hệt với phiên bản chúng ta sẽ làm việc. Nhưng một thể hiện của đối tượng cụ thể này sẽ không phải là thể hiện mà chúng ta cần. Đây là một lỗi hiếm gặp đến mức bạn có thể không thấy nó trong ứng dụng của mình trong một thời gian rất dài. Chỉ tại một thời điểm thích hợp, ứng dụng của bạn có thể bắt đầu tạo ra các lỗi lạ. Kết quả là bạn sẽ phải tốn thời gian để tìm ra nguyên nhân của chúng. Bộ nhớ được phân bổ cho đối tượng của bạn không được sử dụng. Một con trỏ ngẫu nhiên không có kết nối với đối tượng được cấp phát bộ nhớ bằng phương thức “cấp phát” có thể được khởi tạo. Đó là lúc “bản thân” trượt bài kiểm tra

Nếu (tự) (...)
Trong phương pháp khởi tạo đang được xem xét. Và tất cả là do tại một thời điểm nào đó trong chương trình, khi đối tượng này được gọi, quá trình khởi tạo không được thực hiện đúng cách.
Điều cuối cùng chúng ta cần làm để hoàn thành việc khởi tạo là

Tự trả về;
Vì phương thức này không phải là "void", nên nó yêu cầu chúng ta cho nó biết những gì cần trả về ở cuối. Trong trường hợp này, một đối tượng thuộc loại “Primus” sẽ được trả về, bởi vì “self” trong lớp này chính xác là “Primus”. Ngoài ra, loại đối tượng được trả về cho chúng ta biết rằng “Primus” được mong đợi.
Trong các phương pháp này

+(Nhà bếp *) nhà bếpNội thất:(NSArray *)nội thất khácMón ăn:(NSArray *)món ăn; -(UkrainianBorsch *) borschWithIngredients:(NSarray)ingredients casserolAndPan:(NSArray)pan; -(MasterPoRemontu *) serviceItems:(NSArray *)i serviceSkills:(NSArray *)s;
loại đối tượng được trả về là "Kitchen", "UkrainianBorsch" và "MasterPoRemontu".
Do đó, trong phương thức “hotAsHell”, chúng tôi nói rằng khi kết thúc quá trình thực thi phương thức này, chúng tôi muốn nhận một đối tượng thuộc loại “Primus” với tham số đã cho.

Chính xác các thông số được chỉ định là gì?

Hãy để chúng tôi mô tả cách thực hiện phương pháp này

- (id) initWithGas:(Gas *)nhiệt độ khí:(NSInteger)t ( ... ; ; ... )
Điều này có nghĩa là khi gọi phương thức này

Primus *myPrimus = [ initWithGas:nhiệt độ metan:500];
theo nghĩa đen các tham số sau được thiết lập

; ;
Tham số được đặt thành các biến được khai báo trong tệp *.h
Hãy chú ý đến cấu trúc của từ "setGas" hoặc "setTemperature". Nếu có một biến, ví dụ như “biến”, thì bạn có thể đặt nó thành giá trị mong muốn bằng cách sử dụng tiền tố “set”:

Đặt biến
trong trường hợp này, chữ cái đầu tiên của biến sẽ được viết hoa. Vì vậy, chúng tôi phát hiện ra rằng các biến “khí” và “nhiệt độ” đã được khai báo trong tệp Primus.h. Nhưng chính sự hiện diện của các biến không cho chúng ta cơ hội gán chúng bằng tiền tố “set”
Để đạt được tính năng này, bạn cần khai báo thuộc tính cho các biến này. Hãy cùng nói nào:

@property (không nguyên tử, mạnh) Gas *gas; @property (không nguyên tử) Nhiệt độ NSInteger;

Và trong tập tin thực hiện bạn sẽ cần phải viết

@tổng hợp khí, nhiệt độ;
và chỉ sau đó, người ta mới có thể gán giá trị cho chúng thông qua “setGas” và “setTemperature”. Những tiền tố này được gọi là setters.
Vào bất kỳ thời điểm thuận tiện nào, bạn có thể yêu cầu đối tượng Primus hiển thị cho bạn những giá trị này bằng cách truy cập vào thể hiện của nó

; ;
hoặc

MyPrimus.gas; myPrimus.nhiệt độ;
ví dụ như đối với một đội

NSLog(@"Gas Primus chạy bằng gas nhãn hiệu %@, nhiệt độ vận hành %i", , myPrimus. Nhiệt độ);
Những phương pháp này được gọi là getters. Khi truy cập các giá trị từ tên biến, bạn không cần thêm bất cứ thứ gì.
Lưu ý rằng một thuộc tính của một đối tượng có thể được truy cập thông qua cấu trúc

;
và thông qua

MyPrimus.gas;
Họ thực hiện các hành động tương tự.
Có một mẹo khi truy cập các biến đối tượng. Điều này có thể được thực hiện không chỉ thông qua các thuộc tính mà còn thông qua quyền truy cập vào chúng bằng cách sử dụng nguyên tắc khóa-giá trị “mã hóa khóa-giá trị”. Tức là bạn có thể truy cập vào biến

MyPrimus.gas;
Vì thế

;
Chúng tôi đã truy cập giá trị trong đối tượng "Primus" trong từ khóa"khí ga".
Và thiết kế này

;
trong bối cảnh “mã hóa khóa-giá trị”, nó sẽ trông như thế này

;
Sử dụng “mã hóa khóa-giá trị” thay vì thuộc tính là một công việc khá tẻ nhạt. Nhưng cần phải có sự hiểu biết về nó, để trong những trường hợp không thể thiếu nó thì bạn có thể sử dụng nó.
Cũng sẽ hữu ích nếu chỉ ra một thực tế là gần đây, các biến không còn được sử dụng trong lập trình Objective-C nữa. Thuộc tính được sử dụng thay thế. Các thuộc tính có thể được truy cập từ bên ngoài hoặc được đóng gói. Đương nhiên, các biến có thể và nên được sử dụng để sử dụng bên trong các phương thức. Nhưng việc khai báo các biến trong khối “ivar”, nằm trong giao diện lớp, đã lỗi thời rồi.

thời gian chạy

Ngay cả khi điều này chưa xảy ra, vẫn có khả năng bạn sẽ sớm gặp từ “thời gian chạy” trong tài liệu và trong cùng một bài viết, từ “isa”.
Khái niệm “thời gian chạy” có thể được mô tả là “môi trường trong đó mã của bạn được dịch sang mã cấp thấp hơn”. "thời gian chạy" được viết trực tiếp bằng C và Assembly. Đây chưa phải là bản dịch sang mã máy mà là rút gọn mã của bạn sang ngôn ngữ C và hợp ngữ. Phương pháp của bạn

;
trong “runtime” trong C nó trông giống như thế này

Objc_msgSend(myPrimus,@selector(initWithGas:template:),gelium,nil);
Điều này là đủ để một lập trình viên Cocoa mới bắt đầu hiểu: tốt hơn hết là đừng đi sâu vào vấn đề cỏ dại nữa. Ngay khi vượt qua ngưỡng tham gia câu lạc bộ, bạn sẽ có thể tìm thấy thông tin mình cần.

Hiện tại, chúng ta quan tâm đến “isa” là gì.

Đây là biến được khai báo trực tiếp trong NSObject. Biến duy nhất của nó. Khi chúng tôi gọi phương thức

;
khi đó không chỉ một phiên bản của lớp NSObject được tạo mà còn cả một phiên bản của biến này “isa”, tham chiếu đến NSObject. Nghĩa là, nó đặc biệt cho bộ thực thi biết rằng nó thuộc về một NSObject. Điều này có nghĩa là bạn cần làm việc với một thể hiện của đối tượng mới được tạo theo cách tương tự như với NSObject. Một con trỏ tới đối tượng cha mà chúng ta cần kế thừa sẽ được ghi vào “isa”. Giả sử đối tượng của bạn là hậu duệ của NSArray hoặc UITableView hoặc CFDictionaryRef hoặc bất kỳ đối tượng nào khác. Trong trường hợp như vậy, "isa" trỏ đến NSArray hoặc UITableView hoặc CFDictionaryRef hoặc bất kỳ đối tượng nào khác tương ứng. Vì vậy, việc tạo một phiên bản của bất kỳ đối tượng nào cũng tạo ra một biến lớp - “isa”, tham chiếu trực tiếp đến lớp cha, do đó “runtime” biết nó sẽ làm gì với mỗi phiên bản.
Thông tin này ở giai đoạn học tập không cần thiết cho bất kỳ mục đích cụ thể nào mà về nguyên tắc là để hiểu toàn diện hơn về triết lý lập trình Objective-C.
Trong quá trình đọc sách và nhiều tài liệu khác nhau, bạn sẽ gặp phải khái niệm “singleton” nhiều lần. Như một meme phổ biến trên Internet đã nói: “Bạn không thể ngay lập tức hiểu và hiểu “singleton” là gì.

Singleton là gì?

Hãy tưởng tượng rằng bạn cần tạo một đối tượng trả về cùng một phiên bản mỗi khi nó được gọi ở bất kỳ đâu trong ứng dụng. Trên thực tế, trong quá trình tạo ứng dụng, bạn thực sự sẽ cần phải tạo một ứng dụng. Vậy tại sao bạn không thể tạo một đối tượng nhiều lần và gán cùng một dữ liệu cho nó thông qua phương thức "initWithSomething:" hoặc sử dụng setters? Vấn đề là làm việc với bộ nhớ và tốc độ, đồng thời thực sự dành ít thời gian hơn cho việc viết mã. Luôn có ít bộ nhớ và ngay cả khi họ cài đặt 2GB RAM trên iPhone6, nó vẫn sẽ không đủ. Tạo một phiên bản của một đối tượng và sau đó truy cập vào nó sẽ tiết kiệm tài nguyên thiết bị và tăng tốc ứng dụng. Nhưng mọi người đều muốn ứng dụng của mình nhanh như “Bugatti Veyron” và hữu dụng như từ “cải ngựa”.
Giả sử rằng “Primus” của chúng ta có thể là một người độc thân. Sau đó phương pháp của ông

+(Primus *) hotAsHell;
khi thực hiện nó sẽ như thế này

+(Primus*) hotAsHell( static Primus *myPrimus = nil; vị từ static Clark_once_t; return myPrimus; )
Chúng ta hãy xem điều này có nghĩa là gì sau này. Bây giờ, hãy cùng tìm hiểu lý do tại sao “Primus” nên được làm thành một singleton.
Giả sử đây không phải là một chiếc Primus hoàn toàn bình thường mà là một chiếc hiếm. Nó được khắc bởi một nghệ sĩ vô danh, tiêu thụ xăng cực thấp và còn có một chiếc hộp đặc biệt để đựng nó một cách hoàn hảo. Bây giờ hãy tự hỏi bản thân câu hỏi: “Bạn có cần một Primus khác không?” Dĩ nhiên là không! Nhưng khi gửi phương thức

Primus *myPrimus = [ initWitGas:nhiệt độ metan:500];
một “Primus” sẽ được tạo và khi gửi phương thức

Primus *myPrimus = [ initWitGas:nhiệt độ propan:600];
một “Primus” hoàn toàn khác sẽ được tạo ra. Không có khắc và hộp.
Bây giờ chúng ta hãy quay lại những gì được viết khi triển khai phương thức “hotAsHell”.
Trước tiên, bạn cần tạo một thể hiện của một đối tượng có thuộc tính “tĩnh” để chặn quyền truy cập vào đối tượng từ bên ngoài. Sau đó gán cho nó “nil” để nó không lấy địa chỉ ngẫu nhiên trong bộ nhớ. Thiết kế

Vị ngữ tĩnh_once_t;
tạo một vị từ (điều kiện) - "vị ngữ" cũng sẽ không hiển thị từ bên ngoài. Điều kiện là việc gọi khối phía sau vị ngữ một cách tự động hoặc động đều bị cấm. Và đây là dòng.

Dispatch_once (&predicate, ^(myPrimus = [ init];));
đã thực hiện tất cả các hành động cần thiết để tạo bản sao độc nhất sự vật. Cụ thể, "dispatch_once" có nghĩa là biểu thức trong ngoặc đơn sau nó được đảm bảo chỉ chạy một lần trong suốt vòng đời của ứng dụng. Ngoài ra "dispatch_once" còn đảm bảo an toàn cho luồng. Nghĩa là, khi chạy ứng dụng ở chế độ đa luồng, chức năng này sẽ không được gọi đồng thời trong nhiều luồng và chắc chắn sẽ không tạo ra một “Primus” duy nhất nào khác cho chúng ta. Ngoài ra còn có một khối

^(myPrimus = [init];)
Nó giống như một hàm hoặc một phương thức nhỏ. Ngoài ra còn có các khối lớn. Trong khối này, đối tượng cha được khởi tạo, sau đó giá trị của nó được gán cho đối tượng con myPrimus.
Toàn bộ dòng cùng nhau

Dispatch_once (&predicate, ^(myPrimus = [ init];));
có nghĩa là: một lần trong toàn bộ vòng đời của ứng dụng, một phiên bản của đối tượng “Primus” có tên là “myPrimus” sẽ được khởi tạo với các thuộc tính của đối tượng gốc và sẽ không có cách nào để truy cập khối này theo bất kỳ cách nào khác. Nhưng sẽ không ai biết rằng “myPrimus” đã được tạo, bởi vì phiên bản này của đối tượng không thể nhìn thấy được từ bên ngoài. Mọi thứ diễn ra ở chế độ nền và chỉ một lần. Và điều đó xảy ra nhờ có GCD (Grand Central Dispatch). Câu chuyện về đó là một chủ đề riêng biệt.
Và tất nhiên cuối cùng chúng tôi trả lại singleton đã tạo

Trả lại myPrimus;
Chúng ta có Singleton - “Primus”, bây giờ chúng ta có thể thêm các thuộc tính vào nó: hộp - “Hộp”, khắc - “Khắc”, hiệu quả - “Hiệu suất”. Và nếu bạn khai báo thuộc tính cho chúng thì bạn có thể thay đổi các biến này từ bên ngoài. Đậy nắp hộp, làm sạch vết khắc, đẽo đá “Primus” của chúng tôi để tăng hiệu quả. Nhưng nó sẽ vẫn là “Primus” cũ kỹ của chúng tôi. Quyền truy cập bên ngoài vào đối tượng “Primus” sẽ có sẵn cho các lớp đó trong tiêu đề mà nó được khai báo. Nhưng bây giờ nếu bạn làm điều này

Primus *myPrimus = ;
và sau đó làm việc với “myPrimus” như một singleton, thì sẽ không có tác dụng gì. Tất cả quyền truy cập vào các biến đơn phải xảy ra theo cách sau

Hộp *someBox = .Box;
Bằng cách này, bạn có thể tạo một phiên bản “someBox” của một lớp hộp hoàn toàn khác và gán cho nó giá trị mà hộp của singleton của chúng ta có hoặc ngược lại

Hộp = someBox;
thay đổi hộp Primus của chúng tôi.
Một singleton có thể được sử dụng khi bạn cần gọi NSLog kèm theo mô tả về các thuộc tính của singleton, nhưng về nguyên tắc, bản thân singleton không thuộc lớp này. Trong trường hợp này, bạn chỉ cần khai báo nó trong tiêu đề tệp và gọi nó một lần khi cần. Singleton có thể và thậm chí còn được khuyến nghị sử dụng như một biến toàn cục. Chính xác hơn, thuộc tính của nó sẽ là các biến toàn cục.
Sau khi nắm vững các nguyên tắc cơ bản, bạn có thể bắt đầu giải các bài toán được nêu trong sách giáo khoa. Và nếu bạn có thể tìm ra cách viết các phương thức của riêng mình trong các lớp của riêng bạn và gửi phương thức đó đến một đối tượng, thì trong tương lai bạn sẽ cần sử dụng các đại biểu, giao thức và MVC khác. Sẽ cần phải sử dụng tài liệu của Apple và áp dụng hàng nghìn phương pháp khác nhau được các lập trình viên Cupertino tạo ra và mô tả cẩn thận.
Và ở đây nó trở nên không rõ ràng về nguyên tắc như thế nào và những gì hoạt động. Nếu phương thức bạn đã tạo tạo ra một mảng bên trong chính nó, sau đó thêm các đối tượng vào mảng đó, sau đó bắt đầu một vòng lặp và thực hiện điều gì đó trong mảng đó, sau đó phương thức này khởi chạy một phương thức khác của bạn, thì mọi thứ có vẻ rõ ràng. Nhưng bây giờ bạn mở tài liệu về đối tượng mà bạn quan tâm và nó chứa 20 phương thức có thể thực hiện những điều rất thú vị. Ngoài ra, còn có các đối tượng tổ tiên mà các phương thức mà đối tượng này cũng có thể chấp nhận. Ngoài ra, ở đầu bài viết tôi đã viết về các giao thức mà một đối tượng có thể tuân thủ. Tổng cộng có thể có hàng trăm phương pháp. Bạn nên sử dụng cái nào? Câu hỏi ngược lại: “Chính xác thì tại sao bạn lại cần một phương pháp?” Một câu hỏi đúng đã là một nửa câu trả lời. Khi bạn hiểu mình muốn làm gì, bạn có thể tìm thấy phương pháp bạn quan tâm trong phần mô tả lớp và áp dụng nó cho mục đích đã định. Nếu bạn muốn phiên bản này của một đối tượng thực hiện điều gì đó chỉ dành riêng cho lớp mà nó đến, thì trong tài liệu dành cho lớp này, bạn cần tìm kiếm cẩn thận một phương thức thực hiện các thao tác bạn cần. Bạn cần gửi phương thức này đến một đối tượng như thế này

;
Tức là, trong tài liệu bạn đã biết rằng phương thức này lấy đối số đã chỉ định là "Potato" và thực hiện điều gì đó với nó để cuối cùng dẫn bạn đến mục tiêu nếu bạn áp dụng phương thức này cho đối tượng "myPrimus". Không cần phải thực hiện phương pháp này, nó được thực hiện cho bạn ứng dụng trực tiếp. Các trường hợp ngoại lệ là khi bạn cần lấy một lớp làm sẵn từ khung và phân lớp nó để khi bạn gửi phương pháp tiêu chuẩn ví dụ của anh ta, hành động không chuẩn đã xảy ra.

Giao thức

Ngoài ra còn có các phương pháp giao thức. Như tôi đã chỉ ra ở đầu bài, họ không thể có con cháu. Chúng chỉ đơn giản là một tập hợp các phương pháp. Để áp dụng một phương thức giao thức nội bộ, một đối tượng phải tuân theo giao thức đó. Điều này được chỉ định trong tệp *.h

@interface Primus: UIViewController
Trong trường hợp này, đối tượng tương ứng với hai giao thức “UITableViewDataSource” và “UITableViewDelegate”.

Và sự khác biệt giữa các phương thức lớp và giao thức là gì?

Nếu bạn đi sâu vào phần mô tả các giao thức này, bạn có thể tìm thấy các phương thức mà đối tượng có thể triển khai. Xin lưu ý: bạn không gửi các phương thức giao thức đến đối tượng của mình, nhưng bên trong chúng, bạn phải chỉ ra cách đối tượng của bạn sẽ phản ứng khi chương trình gọi các phương thức này. Một số phương pháp trong giao thức có thể là bắt buộc. Và nếu bạn quyết định rằng đối tượng của bạn phải tuân thủ giao thức, thì các phương thức bắt buộc phải được triển khai trước tiên. Trong bất kỳ phương thức giao thức nào cũng có thể có bất kỳ phương thức lớp nào. Nghĩa là, một phương thức giao thức là một thùng chứa bất kỳ phương thức nào khác được đặt trong đó, giống như bất kỳ phương thức nào bạn triển khai. Bạn cần triển khai chức năng cần thiết trong từng phương thức giao thức dựa trên nhu cầu của mình. Ví dụ, bạn cần làm cho khuôn của mình làm được điều gì đó trong những điều kiện nhất định. Ví dụ: nó đổi màu sau khi chuyển sang trạng thái hoạt động/không hoạt động. Hãy xem tài liệu của Apple và xem giao thức nào triển khai các phương pháp bạn cần. Sau đó, chúng tôi tìm kiếm các giao thức mà lớp cha của biểu mẫu tương ứng với. Nếu các giao thức hỗ trợ chức năng bạn cần không có sẵn bộ tiêu chuẩn chức năng, sau đó thêm chúng vào< >dấu ngoặc đơn. Trong phần mô tả các giao thức này, chúng tôi đang tìm kiếm các phương thức được triển khai sau một sự kiện. Hãy cùng nói nào

-(UIColor *) AreaDidChangeColor:(CGRect)orth isActive:(BOOL)active;
được thực thi tự động khi đối số "hoạt động" đánh giá là "CÓ". Và thay đổi màu sắc ở phần màn hình được mô tả trong “trực tràng”:

( if (isActive && myForm == orth)( myColor = ; ) trả về myColor; )
Các phương thức giao thức thiết lập các tham số vận hành của một thể hiện lớp, thay đổi chức năng và truyền giá trị. Ví dụ:

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
trả về số hàng trong phần của tableView đã cho.

Hãy để tôi kết thúc ở đây. Nếu bài viết giúp ích được cho đối tượng mục tiêu, trong đó có tôi cách đây vài tháng, điều đó có nghĩa là tôi nghĩ đúng và cần những bài viết như vậy. Các bài viết không phải của các chuyên gia, mà là của những người hiểu điều gì đó ở mức độ khó có thể vượt qua nếu không có sự hỗ trợ hoặc bàn đạp. Tôi hy vọng bài viết này sẽ là bàn đạp hoặc ít nhất là một chiếc ghế đẩu cho ai đó. Việc thiếu những giáo viên giỏi có thể giải thích điều gì đó một cách chính xác là một vấn đề cơ bản của thời đại chúng ta. Tôi không có trình độ sư phạm, nhưng bài viết trình bày khái niệm về lập trình theo cách mà cá nhân tôi có thể hiểu được.