Tải bản đầy đủ (.docx) (61 trang)

Tìm hiểu lập trình ứng dụng IOS và xây dựng ứng dụng lập danh sách những công việc cần làm cho sinh viên

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (6.16 MB, 61 trang )

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-----------

BÁO CÁO

THỰC TẬP TỐT NGHIỆP
Đề Tài: Tìm

hiểu lập trình ứng dụng IOS và xây
dựng ứng dụng lập danh sách những công việc cần
làm cho sinh viên
Giảng viên hướng dẫn : Ths Nguyễn Lan Anh
Sinh viên thực hiện

: Lê Văn Cảnh

Lớp

: HTTT1-K6

Hà Nội, 3-2015


MỤC LỤC


LỜI MỞ ĐẦU
Dưới sự phát triển vượt bậc của Công nghệ thông tin, thời đại Internet bùng nổ chiếc điện
thoại di động không chỉ đơn giản là phương tiện liên lạc mà nó còn là công cụ hữu ích cho con người.


Ngoài các chức năng nghe, gọi, nhắn tin thông thường, ngày nay điện thoại di động còn có rất
nhiều ứng dụng khác như: quay phim, chụp ảnh, nghe nhạc, chơi game, gửi mail, tìm kiếm thông tin
…Do tính cơ động cao mà các thiết bị di động này ngày càng tham gia mật thiết vào cuộc sống người
dùng.
Do nhu cầu thực tế của các bạn sinh viên trong quá trình học tập cần một công cụ quản lí
công việc, thời gian biểu hàng ngày vì vậy em đã chọn đề tài xây dựng ứng dụng lập danh sách những
công việc cần làm cho sinh viên.
Trong thời gian thực tập tại trường, em đã nhận được sự giúp đỡ, chỉ bảo tận tình của cô Lan
Anh đã giúp em hiểu biết thêm phần nào về lập trình ứng dụng di động IOS và xây dựng một ứng
dụng cụ thể, hoàn chỉnh.
Tuy nhiên do hạn chế về thời gian cũng như nhận thức còn non kém nên báo cáo này không
tránh khỏi những sai sót. Em mong nhận được sự giúp đỡ và đóng góp ý kiến của các thầy cô để báo
cáo được hoàn chỉnh hơn.
Em xin chân thành cảm ơn!


CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1.

Giới thiệu hệ điều hành IOS
IOS là hệ điều hành trên các thiết bị di động của Apple. Ban đầu hệ điều hành này chỉ được

phát triển để chạy trên iPhone (gọi là iPhone OS), nhưng sau đó nó đã được mở rộng để chạy trên
các thiết bị của Apple như iPod touch, iPad và Apple TV.
Giao diện người dùng của iOS dựa trên cơ sở thao tác bằng tay. Người dùng có thể tương tác
với hệ điều hành này thông qua rất nhiều động tác bằng tay trên màn hình cảm ứng của các thiết bị
của Apple.
Hệ điều hành này được tiết lộ tại Hội nghị và Triển lãm Macworld diễn ra vào tháng 1 năm
2007 và được phát hành vào tháng 9 năm đó.Khi đó, hệ điều hành này chưa có một cái tên riêng nên
chỉ đơn giản là "iPhone chạy OS X".Ban đầu, ứng dụng bên thứ ba không được hỗ trợ. Steve Jobs đã

chỉ ra rằng những nhà phát triển có thể xây dựng các ứng dụng web mà "sẽ cư xử như những ứng
dụng ban đầu trên iPhone".
Vào ngày 17 tháng 10 năm 2007, Apple thông báo một bộ phát triển phần mềm đang được
xây dựng và họ dự định sẽ đưa nó đến "tay của các nhà phát triển vào tháng 2". Ngày 6 tháng 3 năm
2008, Apple đã phát hành bản dùng thử đầu tiên, cùng với một cái tên mới cho hệ điều hành, đó là
"iPhone OS".
Tháng 6 năm 2010, Apple đổi cái tên iPhone OS thành iOS. Nhãn hiệu "IOS" đã được Cisco
dùng để đặt tên cho hệ điều hành của mình. Để tránh các vụ kiện cáo, Apple đã xin giấy phép sử
dụng nhãn hiệu iOS từ Cisco.

4


1.2.

Tổng quan về kiến trúc IOS
Khi mà lơi ích của việc định tuyến qua mạng trở nên phát triển, đòi hỏi router phải hỗ trợ

một số những giao thức và một số chức năng khác, như yêu cầu nối giữa các mạng.
Cisco đã thêm những tính năng mới cho phần mềm của router. Kết quả có nhiều chức năng
cầu nối và định tuyến như ngày nay. Nhưng hầu như những kiến trức cơ bản của hệ điều hành vẫn
giống như ban đầu. IOS là một cấu trúc đơn giản, nhỏ, được thiết kế ràng buộc về bộ nhớ, về tốc độ,
về phần cứng của router.

Hình 1.2.1: Kiến trúc hệ điều hành IOS
1.3.

Các thành phần của hệ điều hành IOS
Các tiến trình (Processes):Là những tuyến riêng lẻ kết hợp với dữ liệu để thực hiện các tác vụ


như duy trì hệ thống, chuyển mạch gói dữ liệu, thực hiện giao thức định tuyến…
Nhân (Kernel): Cung cấp những dịch vụ cơ bản của hệ thống tùy thuộc vào IOS như: quản lý
bộ nhớ, lập lịch các tiến trình… nó cung cấp quản lý tài nguyên phần cứng( CPU, bộ nhớ) cho các tiến
trình.
Bộ đệm gói (Packet buffer): Cung cấp các bộ đệm toàn cục và kết hợp với chức năng quản lý
bộ đệm để lưu trữ gói dữ liệu đang được chuyển mạch.
Trình điều khiển thiết bị (Device driver): Làm chức năng điều khiển giao tiếp giữa phần cứng
và thiết bị ngoại vi, giao tiếp giữa các tiến trình IOS, kernel và phần cứng.Chúng cũng giao tiếp với
phần mềm chuyển mạch nhanh (fast switching software).
Phần mềm chuyển mạch nhanh (Fast switching soft): Chức năng chuyển mạch gói dữ liệu
cao.
1.4.

Tổ chức bộ nhớ trong IOS:
IOS ánh xạ toàn bộ bộ nhớ vật lý thành một không gian địa chỉ ảo rộng lớn. MMU (Memory

Map Unit) của CPU có giá trị khi được sử dụng để tạo không gian địa chỉ ảo thậm chí khi mà IOS
không tận dụng một khối nhớ ảo trọn vẹn.

5


Miền bộ nhớ (Memory region) : IOS chia không gian địa chỉ này thành những miền bộ nhớ gọi
là region, mỗi region phù hợp với những loại bộ nhớ vật lý khác nhau. Ví dụ : SRAM có thể lưu trữ gói
dữ liệu và DRAM có thể lưu trữ phần mềm hoặc dữ liệu. Phân lớp bộ nhớ thành các region cho phép
IOS phân loại các bộ nhớ khác nhau vì vậy mà phần mềm không cần biết chi tiết về bộ nhớ trên mỗi
platform .
Các region được phân chia thành một trong tám mục như hình :

MEMORY REGION

Local(cục bộ)

ĐẶC ĐIỂM
Thông thường lưu trữ cấu trúc dữ liệu lúc chạy và
local heap, thường là DRAM
Bộ nhớ chia sẻ CPU và bộ điều khiển môi trường

Lomem

mạng sử dụng thông qua một bus dữ liệu, thường là
SRAM

Fast

Bộ nhớ truy xuất nhanh, như SRAM, sử dụng cho
mục đích đặc biệt và những tác vụ xem yêu cầu về tốc độ

Itext

Thực thi mã nguồn của iOS

Idata

Các biên được khởi tạo

IBss

Các biên không được khởi tạo

PCI


Bộ nhớ bus CPI, được sử dụng bởi tất cả thiết bị
trên các bus PCI
Bộ nhớ flash dùng để lưu trữ iOS chạy từ RAM
hoặc iOS chạy từ flash, nó cũng có thể lưu trữ một bảng

Flash

file(tập tin) cấu hình dự phòng và những dữ liệu
khác.Thông thường thì file hệ thống được xây dựng ở
miền bộ nhớ flash này.
Hình 2: Các loại Region

Vùng bộ nhớ (Memory pool): iOS quản lý bộ nhớ rỗi thông qua một chuỗi các memory
pool.Mỗi pool là một tập hợp các khối nhớ mà có thể cấp phát và thu hồi khi cần.Memory pool được
xây dựng bên ngoài các region và được quản lý bởi kernel. Thường thì pool tương đương với một
region đặc biệt.

6


.
Hình 3 : Region và Subregions

Một memory pool có thể xây dựng từ một vài region mở rộng, cho phép bộ nhớ được cấp
phát và thu hồi từ các miền bộ nhớ khác nhau để tối đa hiệu quả hoạt động, có thể dùng lệnh show
memory để hiển thị các pool này: router#show memory Head Total(b) Used(b) Free(b) Lowest(b)
Largest(b) Processor 61281540 7858880 3314128 4544752 4377808 4485428 I/O1A00000 6291456
1326936 4964520 4951276 4964476 PCI 4B000000 1048576 407320 641256 6412556 641212 … Mô
tả như sau(kích thước tính theo byte):


1.5.



Total: kích thước của pool.



Used: lượng bộ nhớ được cấp phát.



Free: lượng bộ nhớ sẵn sằng để sử dụng.



Lowest: lượng bộ nhớ thấp nhất sẵn sàng sử dụng từ khi mà pool được tạo.



Largest: kích thước khối nhớ liên tục lớn nhất sẵn sàng sử dụng hiện tại.

Tiến trình iOS (Processes iOS)
Vòng đời của một tiến trình: Một tiến trình có thể được tạo ra hoặc kết thúc bất cứ lúc nào

trong khi iOS đang hoạt động ngoại trừ có ngắt xảy ra.Nó được tạo ra bởi kernel hoặc bởi một tiến
trình khác đang chạy khác. Một thành phần có trách nhiệm tạo nhiều tiến trình trong iOS gọi là
parser(bộ phân tách).


7


Parser này là một tập các chức năng làm phiên dịch cấu hình iOS và dòng lệnh EXEC.Parser
được yêu cầu bởi kernel trong suốt quá trình khởi tạo iOS và các tiến trình EXEC, để cung cấp một
giao tiếp dòng lệnh CLI thông qua giao tiếp console (giao tiếp người và máy) và các phiên telnet.Tại
bất cứ thời điểm nào, một lệnh được nhập bởi người dùng hoặc một cấu hình được đọc từ file,parser
phiên dịch dòng lệnh và đưa ra những hoạt động tức thời.
Một vài lệnh cấu hình bởi việc gán trị, như địa chỉ IP, trong khi cấu hình khác như định tuyến
hoặc giám sát. Một vài lệnh làm cho parser khởi tạo một tiến trình mới. Ví dụ: khi mà lệnh cấu hình
no router eigrp được nhập vào, parser khởi tạo một tiến trình mới, gọi là ipigrp (nếu như tiến trình
ipigrp đã được khởi tạo rồi), bắt đầu xử lý gói ip. EIGRP.Nếu như lệnh cấu hình no router eigrp được
nhập vào, parser kết thúc tiến trình ipigrpvà không còn chức năng định tuyến EIGRP. Tiến trình iOS
trải qua các trạng thái như sau:


Trạng thái khởi tạo (Create): Khi mà một tiến trình mới được tạo, nó nhận vùng stack riêng
của mình và vào trạng thái mới (new).Tiến trình có thể di chuyển đến trạng thái điều chỉnh
(Modify).Nếu không có thay đổi cần thiết, thì tiến trình chuyển sang trạng thái thực thi
(Execute).



Trạng thái điều chỉnh (Modify): Không giống như hầu hết các hệ điều hành, iOS không tự
động truyền tải các tham số khởi tạo hoặc gán một giao tiếp đến một tiến trình mới khi nó
được tạo, bởi vì nó cho rằng hầu hết các tiến trình không cần tài nguyên này.Nếu một tiến
trình cần nguồn tại nguyên này, tuyến mà tạo nó có thể điều chỉnh để thêm vào.




Trạng thái thức thi (Execute): Sau khi một tiến trình mới được tạo thành công và điều chỉnh,
nó chuyển sang trạng thái sẵn sàng (Ready) và vào trạng thái thực thi (Execute).Trong suốt
trạng thái này, một tiến trình có thể truy cập CPU và chạy.Trong suốt trạng thái thực thi , một
tiến trình có thể truy cập CPU và chạy.Trong suốt trạng thái thựcthi , một tiến trình có thể là
một trong 3 trạng thái: sẵn sàng, chạy và rỗi (Idle).Một tiến trình ở trạng thái sẵn sàng sẽ đợi
chuyển sang trạng thái truy cập CPU và bắt đầu thực thi lệnh.
Một tiến trình ở trạng thái rỗi là đang ngủ, đợi sự kiện bên ngoài xuất hiện trước khi nó có

thể chạy.Một tiến trình chuyển từ trạng thái sẵn sàng sang trạng thái chạy khi mà nó được lập lịch để
chạy. Với đa tác vụ mà không ưu tiên (non-preemptive multitasking), một tiến trình được lập lịch
chạy trên CPU cho đến khi tạm ngừng hoặc kết thúc.
Một tiến trình có thể tạm dừng theo 2 cách: nó có thể tự dừng bởi việc báo cho kernel, nó
muốn nhường cho CPU và chuyển sang trạng thái sẵn sàng, và đợi đến lúc chạy lại.Tiến trình cũng có
thể dừng bởi một hoạt động bên ngoài xảy ra.Khi mà một tiến trình đợi một sự kiện, kernel hoàn
toàn dừng tiến trình này và chuyển nó sang trạng thái rỗi.Sau khi một sự kiện xảy ra rồi thì kernel
chuyển tiến trình trở lại trạng thái sẵn sàng để đợi chạy lại.

8


Trạng thái kết thúc (Terminal): Trạng thái cuối cùng trong vòng đời của tiến trình là trạng thái
kết thúc.Một tiến trình vào trạng thái kết thúc khi nó hoàn thành chức năng của mình và đóng lại
hoặc khi một tiến trình khác đóng nó.Khi một tiến trình bị đóng hoặc tự đóng, tiến trình chuyển sang
trạng thái chết (Dead).Tiến trình này ở trạng thái chết (không hoạt động) cho đến khi kernel thu hồi
tất cả các tài nguyên của nó.Sau khi tài nguyên được thu hồi, tiến trình bị kết thúc thoát khỏi trạng
thái chết và xóa khỏi hệ thống.
Độ ưu tiên tiến trình iOS: iOS thực hiện chế độ ưu tiên để lập lịch các tiến trình trên CPU.Tại
thời điểm tạo, mỗi tiến trình được gán một trong 4 độ ưu tiên dựa trên mục đích của tiến trình.Độ
ưu tiên là không đổi, chúng được gán khi một tiến trình được tạo và không bao giờ thay đổi.Các độ
ưu tiên:



Critical: Dành riêng cho những tiến trình hệ thống thiết yếu mà giải quyết những vấn đề
cấp phát tài nguyên.



High: Được gán cho những tiến trình mà cung cấp đáp ứng nhanh, như tiến trình nhận gói
trực tiếp từ giao tiếp mạng . -Medium: Độ ưu tiên mặc định sử dụng bởi hầu hết các tiến
trình.



Low: Được gán cho những tiến trình cung cấp những tác vụ mang tính định kỳ như bảng
ghi lỗi… Độ ưu tiên các tiến trình cung cấp sự ưu đãi cho một vài tiến trình để truy cập
CPU dựa trên sự quan trọng của nó đối với hệ thống và iOS không thực hiện quyền ưu
tiên.Một tiến trình có sự ưu tiên cao hơn không thể ngắt một tiến trình có độ ưu tiên thấp
hơn, thay vào đó, tiến trình có độ ưu tiên cao hơn thì có nhiều cơ hội hơn để truy cập CPU
hơn.

1.6.

Kernel IOS
IOS Kernel không là một đơn vị mà là một tập các thành phần và chức năng lien kết chặt chẽ

với nhau.iOS Kernel thực hiện các chức năng sau: Lập lịch tiến trình, quản lý bộ nhớ, cung cấp dịch vị
retimes để trap (phát hiện) và handle (điều khiển) những ngắt phần cứng, duy trì timer (bộ định thời
gian), và phát hiện ngoại lệ phần mềm. Các chức năng chính của Kernel:
Lập lịch: Tác vụ lập lịch các tiến trình được thực hiện bởi scheduler (bộ lập lịch). Scheduler
quản lý tất cả các tiến trình trong hệ thống bằng cách sử dụng một chuỗi các hang đợi tiến trình mô

tả trạng thái của mỗi tiến trình.Các hàng đợi này chứa nội dung thông tin cho tiến trình ở trạng thái
đó.Tiến trình chuyển từ trạng thái này sang trạng thái khác khi mà scheduler di chuyển ngữ cảnh từ 1
hàng đợi tiến trình này đến hàng đợi tiến trình khác.
Quản lý bộ nhớ: Bộ quản lý bộ nhớ của Kernel tại mức quá cao quản lý tất cả các vùng nhớ có
sẵn của iOS, bao gồm bộ nhớ chứa iOS của nó.Bộ quản lý bộ nhớ ba thành phần riêng biệt, với những
nhiệm vụ riêng.

9


Có ba bộ quản lý bộ nhớ sau: Bộ quản lý Region, Bộ quản lý Pool, Bộ quản lý Chunk.


Bộ quản lý Region: Định nghĩa và duy trì những region khác nhau trên một platform.Bộ quản
lý region có chức năng duy trì tất cả các region.Nó cung cấp các dịch vụ cho phép những phần
khác của iOS tạo region và gán các thuộc tính của chúng.Nó cũng cho phép những phần khác
truy vấn những region có sẵn, ví dụ quyết định tổng lượng bộ nhớ có sẵn trên một platform.

Hình 1.6: Sự phân mảnh bộ nhớ


Bộ quản lý pool: Quản lý việc tạo ra các vùng nhớ pool, cấp phát và thu hồi các khối nhớ của
pool. Bộ quản lý pool là một thành phần quan trọng của Kernel.Trong khi scheduler quản lý
cấp phát tài nguyên CPU để xử lý,bộ quản lý pool cấp phát bộ nhớ cho các tiến trình.Tất cả
các tiến trình phải thông qua bộ quản lý bộ nhớ pool trực tiếp hoặc gián tiếp, để định ra vùng
nhớ mà nó sử dụng.Bộ quản lý bộ nhớ được yêu cầu cho mỗi tiến trình sử dụng hàm hệ
thống chuẩn malloc và free để lấy và trả bộ nhớ.Bộ quản lý bộ nhớ hoạt động bởi việc duy trì
danh sách khối nhớ rỗi cho mỗi pool, ban đầu mỗi pool chứa chỉ một khối nhớ rỗi lớn
bằngkích thước một pool.Khi bộ quản lý bộ nhớ pool yêu cầu bộ nhớ,khởi tạo những khối
nhớ có kích thước nhỏ hơn.Tại cùng một thời điểm,các tiến trình có thể giải phóng vùng nhớ

trả về pool, tạo thành một số vùng nhớ rối không liên tục nhau, nhiều kích thước, trường hợp
này gọi là phân mảnh bộ nhớ.

10




Quản lý Chunk: Quản lý pool cung cấp nhiều cách hiệu quả để quản lý một tập hợp các khối
có kích thước khác nhau.Tuy nhiên những tính năng này có chi phí của nó, bộ quản lý pool tạ
ra 32 byte overhead trên mỗi bộ nhớ.Mặc dù overhead này không quan trọng lắm đối với
khối dữ liệu lớn, đối với pool có hàng ngàn khối dữ liệu nhỏ hơn thì overhead mới trở nên
đáng quan tâm.
Để tạo thêm sự lựa chọn thì kernel cung cấp bộ quản lý bộ nớ khác gọi là bộ quản lý bộ nhớ

Chunk, nó có thể quản lý lượng lớn pool có nhiều khối nhớ nhỏ mà không có overhead.Không giống
như quản lý pool, bộ quản lý Chunk không tạo ra danh sách vùng nhớ rỗi với kích thước khác
nhau.Thay vào đó bộ quản lý chunk quản lý một tập các khối nhớ cố định được chỉ định từ một trong
các vùng nhớ pool.Trong một vài trường hợp, bộ quản lý chunk có thể xem như là một bộ quản lý
pool vùng nhớ con.
Các chính sách thường được thực hiện là: Một tiến trình yêu cầu một vị trí của mooth khối
nhớ từ một vùng nhớ pool đặc biệt.Một tiến trình sau đó gọi đến bộ quản lý chunk để chia khối nhớ
thành một chuỗi các chunk có kích thước cố định và nhỏ hơn,.Sử dụng bộ quản lý chunk để định vị ra
những vùng nhớ rối khi cần.Thuận lợi là ổ đây chỉ có 32 byte overhead và bộ quản lý pool thì không
bắt buộc cấp phát và lấy lại hàng ngàn phân mảnh nhỏ hơn.Vì vậy khả năng phân mảnh trong pool
giảm đáng kể.
Quản lý bộ đệm gói: Trong định tuyến gói dữ liệu, bất cứ hoạt động lưu trữ hay chuyển dữ
liệu đều phải cần có một nơi để lưu trữ dữ liệu trong khi dữ liệu đang được định tuyến trên đường
truyền.Thông thường thì tạo ra một bộ đệm để lưu trữ các gói đến trong khi hoạt động chuyển mạch
đang hoạt động.Bởi vì khả năng định tuyến gói là trung tâm của cấu trúc hệ điều hành iOS.

IOS chứa thành phầnchuyên biệt để quản lý những vùng đệm này.Thành phần này được gọi
là bộ quản lý vùng đệm bộ nhớ.iOS sử dụng thành phần này để tạo và quản lý nhất quán một chuỗi
các vùng đệm cho chuyển mạch trên mỗi platform.
Bộ đệm trong vùng này được biết chung là những bộ đệm hệ thống.Bộ quản lý vùng bộ đệm
cung cấp một cách tiện lợi để quản lý một tập các bộ đệm có kích thước cụ thể.Mặt dầu nó có thể
được sử dụng để quản lý bất cứ loại bộ đệm nào, bộ quản lý bộ đệm được sử dụng chính để quản lý
những vùng bộ đệm gói.Những vùng đệm gói được tạo từ các vùng nhớ pool có sẵn.Đểf. tạo một
vùng, bộ quản lý bộ đệm yêu cầu một khối nhớ từ bộ quản lý pool và chia cho bộ đệm.Bộ quản lý bộ
đệm gói sau đó tạo một danh sách cho tất cả các bộ đệm rỗi và theo dõi các vùng nhớ này.
Những vùng đệm có thể là động hay tĩnh, vùng bộ đệm tĩnh được tạo với số bộ đệm cố định,
không thêm bộ đệm vào cùng bộ đệm tĩnh này.Vùng bộ đệm động được tạo với một số bộ đệm tối
thiểu.Gọi là bộ đệm thường xuyên, có thể thêm hoặc xóa các bộ đệm.Với các vùng nhớ động , nếu bộ
quản lý bộ đệm nhận được yêu cầu khi vùng nhớ rỗng, nó cố gắng mở rộng vùng nhớ và đáp ứng yêu
cầu ngay lập tức.

11


Nếu nó không thể mở rộng vùng nhớ, thì yêu cầu bị lỗi và thực hiện mở rộng vùng nhớ sau đó.vùng
bộ đệm được phân lớp public (dùng chung) hoặc private (dùng riêng). Vùng public được sử dụng bởi
bất cứ tiến trình nào của hệ thống. Private được tạo cho một tập các tiến trình sử dụng.
Bộ đệm hệ thống: Mỗi iOS đều có một tập các bộ đệm public định trước gọi là những bộ đệm
hệ thống, những bộ đệm này được sử dụng cho tiến trình chuyển mạch các gói dữ liệu và tạo gói
(như gói keepalive, gói cập nhật định tuyến).
1.7.

Trình điều khiển thiết bị
IOS chứa trình điều khiển thiết bị cho các thiết bị phần cứng, như flash card, NVRAM, nhưng

đáng chú ý là trình điều khiển cho các giao tiếp mạng.Trình điều khiển các giao tiếp mạng cung cấp

những khả năng chính cho hoạt động của gói dữ liệu tại đầu ra của giao tiếp.
Mỗi thiết bị chứa hai thành phần chính: thành phần điều khiển và thành phần dữ liệu. Thành
phần điều khiển có trách nhiệm quản lý tình trạng và trạng thái của thiết bị (ví dụ: shutdown trên
một cổng). Thành phần dữ liệu có trách nhiệm đối với tất cả các luồng hoạt động chuyển mạch gói dữ
liệu. Trình điều khiển thiết bị có quan hệ chặt chẽ với chức năng chuyển mạch gói.
Trình điều khiển thiết bị giao tiếp mạng dựa trên hệ thống iOS thông qua một cấu trúc điều
khiển đặc biệt gọi là IDB (interface descriptor block). IDB chứa toàn bộ chức năng điều khiển thiết bị,
dữ liệu, trạng thái thiết bị. Ví dụ: địa chỉ IP,trạng thái cổng, thống kê gói là một trong các trường hiện
tại trong IDB.iOS duy trì một IDB cho mỗi giao tiếp hiện tại trên một platform.
Cấu trúc chuyển mạch gói: Chuyển mạch gói là một trong các chức năng quan trọng nhất của
router, hoạt động bao quát như sau:


Một gói đến một cổng.



Địa chỉ đích của gói được kiểm tra và so sánh dựa vào danh sách đích đã biết.



Nếu phù hớp, gói được chuyển tiếp ra cổng phù hợp.



Nếu không phù hợp, gói bị hủy.Rõ ràng vấn đề chuyển mạch không quá phức tạp, nhưng
để chuyển mạch được nhanh thì vấn đề trở nên phức tạp.Tốc độ hoạt động không chỉ dựa
vào tốc độ CPU, còn có những nhân tố khác, khẳ năng thực thi của bus I/O. tốc độ bộ nhớ
đều có ảnh hưởng đến sự thực thi của chuyển mạch.Đây là một thử thách lớn đối với các
nhà phát triển iOS.


Làm thế nào để tốc độ chuyển mạch nhanh nhất mà có thể giới hạn trên các thành phần CPU,
bộ nhớ, bus I/O.Khi mà kích thước và số mạng định tuyến tăng lên, những người phát triển iOS tiếp
tục tìm ra những cách tốt nhất để giải quyết thử thách thực thi này.
Đầu tiên thì iOS chỉ có chức năng chuyển mạch nhưng đã được cải thiện về sau, một vài
phương thức chuyển mạch dựa trên nhiều platform khác nhau.Ngày nay iOS có thể chuyển mạch tới
vài trăm ngàn gói trên một giây, sử dụng bạn định tuyến tới vài trăm ngàn tuyến đi.

12


1.8.

Kiến trúc của hệ điều hành iPhone
Bao gồm các lớp sau :

Hình 1.8 : Kiến trúc hệ điều hành iPhone
Các lớp dưới cùng là nền tảng của hệ điều hành, phụ trách quản lý bộ nhớ, các file hệ thống,
mạng, các hệ điều hành nhiệm vụ và tương tác trực tiếp với các phần cứng.
Lớp Core OS : Lớp Core OS bao gồm các thành phần : -OS X Kernel -Match 3.0 -BSD -Sockets
-Security -Power Management -Key chain -Certifi cates -File System -Bonjour
Lớp Core Services : Lớp Core Services cung cấp một trừu tượng trên các dịch vụ được cung
cấp trong lớp OS X Kernel.Nó cung cấp truy cập cơ bản để các dịch vụ hệ điều hành iPhone và bao
gồm các thành phần sau : -Collection -AddressBook -Networking -Files Access-SQLite -Core Location
-Net Services -Threading -Preferences -URL Utilities
Lớp Media(Truyền thông): Lớp Media cung cấp các dịch vụ đa phương tiện mà bạn có thể sử
dụng trong iPhone và iPad.Nó bao gồm các thành phần sau : -Core Audio -OpenGL -Audio Mixing
-Audio Recording -Video Playback -JPG,PNG,TIFF -PDF -Quartz -Core Animation -OpenGL ES

13



Lớp Cocoa Touch : Lớp Coscoa Touch cung cấp một lớp trừu tượng để khai báo các thư viện
khác nhau cho các lập trình iPhone và iPad, như sau:


Multi



Touchcontrols



Celerometer



View Hierachy



Localization



Alert




Web View



People Picker



Image Picker



Controllers.

14


CHƯƠNG 2: NGÔN NGỮ LẬP TRÌNH SWIFT
2.1. Giới thiệu ngôn ngữ Swift
2.1.1. Ngôn ngữ lập trình bậc thấp và bậc cao

Có rất nhiều cách để ra lệnh cho một thiết bị thông minh (laptop, máy để bàn, smartphone,
tablet…) làm chính xác những gì bạn muốn. Cách chính xác nhất nhưng lại khá phức tạp là viết các
dòng lệnh bằng… mã máy (mã nhị phân) hoặc sử dụng viết mã Assembly. Khi viết mã Assembly, bạn
sẽ phải viết từng câu lệnh chi tiết cho những hoạt động rất nhỏ, ví dụ như thay đổi một số trên bộ
nhớ, thay đổi màu của một pixel trên màn hình… nói cách khác là tất cả các hành động nhỏ nhất mà
phần cứng có thể thực hiện.
Nếu viết mã Assembly (hoặc mã máy), bạn có thể thực hiện những hành vi phức tạp nhất,
đúng-với-mong-muốn nhất. Nhưng, hiển nhiên là khi sử dụng các ngôn ngữ bậc thấp (ngôn ngữ bậc
thấp: xa với ngôn ngữ người và gần với ngôn ngữ máy) như mã máy hoặc mã Assembly, việc lập trình

ứng dụng sẽ trở nên cực kỳ nhàm chán, vất vả và rất dễ mắc phải lỗi. Việc viết ra Safari hay thậm chí
là Flappy Bird bằng mã Assembly cũng sẽ là bất khả thi.
Bởi vậy, bạn sẽ cần tới các ngôn ngữ lập trình bậc cao (high level). Thay vì thực hiện từng
dòng lệnh nhỏ nhặt từ người lập trình viên, máy vi tính sẽ nhận một câu lệnh "bậc cao" từ coder và
tự thực hiện dòng lệnh này. Các ngôn ngữ bậc cao giống với ngôn ngữ người ở chỗ chúng có cấu trúc
ngữ pháp (syntax) rất rõ ràng với các giới hạn cụ thể về vị trí sắp xếp từ ngữ mà người dùng ngôn ngữ
cần tuân theo.

Để hiểu rõ về sự khác biệt giữa ngôn ngữ lập trình bậc cao và ngôn ngữ lập
trình bậc thấp, hãy thử tưởng tượng khi bạn nhờ người bạn thân đưa cho mình một lon
Coca. Nếu dùng ngôn ngữ lập trình bậc cao, bạn sẽ nói "Ê, ném cho tao lon Coca ở
trên bàn!", và người bạn này sẽ biết cách để thực hiện hành vi này. Nếu sử dụng ngôn
ngữ Assembly, bạn sẽ phải nói đầy đủ đoạn văn sau: "Ngồi dậy. Đặt 2 chân xuống sàn.
Dùng tay làm điểm tựa. Đứng dậy khỏi ghế sofa. Bước một bước bằng chân phải.
Bước bằng chân trái. Cầm lon Coca bằng tay phải. Quay về phía tao. Bước một bước
bằng chân phải…".
Nói ngắn gọn, bằng các ngôn ngữ bậc thấp, bạn sẽ phải mô tả tất cả các hành vi
độc lập cần thiết để thực hiện toàn bộ tác vụ. Thậm chí, nếu bạn quên không ra lệnh
"dùng tay làm điểm tựa", người bạn (máy vi tính) của bạn có thể bị ngã (gặp lỗi) khi
thực hiện tác vụ.

15


Chính điều này buộc con người phải sử dụng các ngôn ngữ lập trình bậc cao.
Trong số các ngôn ngữ lập trình bậc cao, C là ngôn ngữ "kinh điển" nhất. Đây là ông
tổ của nhiều ngôn ngữ lập trình phổ biến khác hiện nay, từ C++, Objective-C, C# cho
đến cả Java và PHP. Trong số các ngôn ngữ chịu ảnh hưởng/biến thể từ C, Objective-C
là lựa chọn truyền thống của Apple và cũng là nền tảng xây dựng nên iOS và Mac OS.
Nhưng, khi C đã có tuổi đời lên đến 40 năm và khi Objective-C cũng đã có tuổi

đời lên đến 30 năm, Apple cần sự thay đổi. Câu trả lời là Swift.
2.1.2. Ngôn ngữ lập trình dạng script

Script programming language, thường gọi là ngôn ngữ script, đang dần trở nên
phổ biến hơn trước đây rất nhiều. Thông thường, các ngôn ngữ lập trình bậc cao sẽ cần
được biên dịch (compile) thành mã máy để có thể thực thi. Quá trình biên dịch được
thực hiện bởi compiler là khi các câu lệnh bậc cao (ví dụ như "lấy lon Coca") được
chuyển thành các lệnh nhỏ, đơn giản mà máy tính có thể thực hiện.
Dựa trên syntax đặc trưng của ngôn ngữ, các dòng lệnh mà con người (các lập
trình viên) có thể đọc được sẽ được chuyển thành mã máy, và nếu như quá trình biên
dịch thành công, bạn sẽ nhận được một ứng dụng thực sự. Lưu ý rằng các file mã
nguồn chưa qua biên dịch sẽ không có ý nghĩa gì với CPU cả.
Tuy vậy, quá trình biên dịch mã nguồn có thể sẽ mất rất nhiều thời gian. Như đã
nói ở trên, nếu chưa đưa mã nguồn vào compiler, bạn sẽ không thể biết được liệu các
dòng code mà bạn đã viết ra có thực sự hoạt động hoàn hảo hay không. Trong rất
nhiều trường hợp, các lỗi trong dòng code của bạn sẽ không bị phát hiện cho tới khi
compiler thực hiện nhiệm vụ của mình, và thậm chí khi đã biên dịch xong, bạn sẽ phải
chạy chương trình để phát hiện nốt những lỗi còn lại. Tất cả những điều này khiến cho
quá trình viết ứng dụng phần mềm trở nên rất chậm chạp.
Ngôn ngữ script khác với các ngôn ngữ này. Bạn có thể chạy các đoạn mã script
vừa viết ra ngay lập tức, từ dòng này tới dòng tiếp theo. Bạn có thể kiểm tra kết quả
của mình mà không cần chờ đợi quá trình biên dịch. Điều này giúp cho quá trình phát
triển ứng dụng nhanh và dễ dàng hơn rất nhiều.
Song, các ngôn ngữ script cũng có giới hạn của chúng. Giới hạn đầu tiên là về
tính năng: chúng không thể làm được các tác vụ phức tạp như các ngôn ngữ compile
khác. Tệ hơn, chúng bị giới hạn về hiệu năng xử lý. Điều này khiến các ngôn ngữ
16


script trở nên giới hạn hơn rất nhiều so với các ngôn ngữ compile và không được sử

dụng để thực hiện các chương trình đòi hỏi tối ưu sức mạnh phần cứng.
Như vậy, các ngôn ngữ dạng script như Python rất dễ viết và test (kiểm thử),
song chúng không mạnh mẽ và cũng không đủ nhanh để thực hiện các tác vụ phức tạp
của ứng dụng. Nói cách khác, Python không thực sự phù hợp để viết các game nặng,
vốn có yêu cầu phải tận dụng tối đa sức mạnh của thiết bị. Các ngôn ngữ lập trình
truyền thống (ví dụ như Objective-C) mang tới hiệu năng khi chạy trên iPhone/iPad,
cho phép tạo ra các ứng dụng phức tạp như iMovie hoặc Call of Duty. Song, việc sử
dụng Objective-C thường đi kèm với một lượng lớn thời gian compile và test ứng
dụng. Việc học cách viết Objective-C cũng là một quá trình dài, có thể gây khó khăn
với các lập trình viên ít kinh nghiệm.
Nếu thực hiện được tất cả các lời hứa của Apple, Swift sẽ mang tất cả các điểm
mạnh của cả 2 loại ngôn ngữ script và compile truyền thống. Trong một số thử nghiệm
benchmark, Swift cho hiệu năng nhanh hơn Python và thậm chí là nhanh hơn cả
Objective-C. Trên bộ IDE (phần mềm lập trình) Xcode của Apple, mã nguồn Swift sẽ
được đồ thị hóa dựa trên tính năng playground theo thời gian thực. Điều này có nghĩa
rằng lập trình viên có thể chạy và test mã nguồn Swift một cách dễ dàng không kém gì
Python cả.
Trong ví dụ được đưa ra tại WWDC, một lập trình viên đã lên sân khấu để thực
hiện cảnh đồ họa bay lên/xuống cho khinh khí cầu theo định kỳ. Để làm được điều
này, anh ta cần sử dụng một hàm toán học đơn giản: hàm sin. Sin tạo ra đồ họa hình
gợn sóng khá đẹp, và bởi vậy hàm sin sẽ là khá hoàn hảo cho ví dụ của chúng ta.
Trong màn demo trên sân khấu WWDC, lập trình viên Swift đã có thể gán hàm
sin vào chuyển động của khinh khí cầu một cách dễ dàng. Anh ta có thể theo dõi giá trị
hàm sin thay đổi khi chạy chương trình của mình, dựa trên một biểu đồ đơn giản hiển
thị trên Xcode. Điều này giúp cho nhà phát triển có thể dễ dàng hình dung ra chuyển
động của quả bóng bay trên.
Trong các ví dụ tương tự, bạn có thể điều chỉnh các chuyển động một cách rất
dễ dàng. Gần đây, một nhà phát triển ứng dụng thậm chí còn sử dụng Swift để tạo ra
một phiên bản Flappy Bird sơ khai trong vòng… 17 phút! Thông thường, quá trình
phát triển phần mềm đòi hỏi các lập trình viên vừa phải viết code, vừa phải thực hiện

biên dịch (thông qua compiler), sau đó chạy chương trình và… nín thở hy vọng. Tùy
17


thuộc vào độ lớn của ứng dụng, quá trình compile và chạy thử ứng dụng có thể mất vài
giây, vài phút hoặc lâu hơn nữa.
2.1.3. Những lợi ích của Swift

Khả năng phát triển ứng dụng di động và kiểm tra thành quả của mình theo thời
gian thực sẽ giúp cho quá trình code của các lập trình viên trở nên nhanh và dễ dàng
hơn rất nhiều. Ngoài ra, việc không phải chạy chương trình compiler và các chương
trình test quá thường xuyên cũng sẽ tiết kiệm được sức mạnh phần cứng cho nhà phát
triển. Thay vì tập trung kiểm tra, thử nghiệm các tính năng nhỏ lẻ, lập trình viên Swift
có thể dành nhiều thời gian để thực hiện các bài test ở mức độ tích hợp cao hơn một
cách kỹ càng hơn.
Lợi ích thứ 2 của Swift là các dòng code rất ngắn và dễ đọc. Trong bài trình bày
của Apple, 3 dòng code Objective C có thể gói gọn vào 1 dòng code Swift. Điều này sẽ
đẩy nhanh quá trình phát triển ứng dụng và tăng hiệu quả cho quá trình bảo trì/vá lỗi
trong tương lai.
Swift hoạt động tương tự một phiên bản Objective C đơn giản, với các lớp đối
tượng được đơn giản hóa, và các dòng mã được sắp xếp hợp lý. Với Swift, Các nhà
phát triển sẽ có môi trường runtime tương tự Objective C, do vậy nó rất quen thuộc và
dễ quản lý.
Ngoài sự đơn giản và phương thức sắp xếp hợp lý hơn cho việc sáng tạo ứng
dụng, X Code runtime được thực hiện trong thời gian thực cho Swift. Viết một dòng
mã và nhận được kết quả trong thời gian thực, và hình ảnh cũng có thể được xem từ
bên trong IDE. X Code cũng sẽ dựng các kịch bản(script) thực hiện trong các ứng
dụng, vì vậy theo Apple nói thì lập trình viên có thể quản lý tốt hơn một ứng dụng để
tránh sự cố tràn bộ nhớ.
Swift có thể làm việc liền mạch với Objective C, vì vậy các ứng dụng hiện tại

có thể được cập nhật bằng Swift. Các nhà phát triển cũng có thể sử dụng các công cụ
hữu ích của Objective C ngay chính trên Swift (có thể sống chung với mã C và
Objetive-C trong cùng một ứng dụng).
Swift tạo ra các ứng dụng có sức ép phần cứng thấp hơn Objective-C, chúng ta
sẽ được tận hưởng trải nghiệm game ấn tượng hơn trên các thiết bị iOS.
2.1.4. Điểm yếu của Swift

18


Điểm yếu lớn nhất của Swift sẽ là tuổi đời quá trẻ của ngôn ngữ lập trình này.
Cụ thể hơn, để sử dụng Swift, các nhà phát triển sẽ phải học lại một ngôn ngữ lập trình
hoàn toàn mới. Ngành công nghệ thường thích được làm chủ các công nghệ mới nhất,
tuyệt vời nhất. Song, mảng ứng dụng iOS cũng đã trở nên lớn mạnh tới mức có hàng
nghìn người đã dành hàng tháng trời để làm chủ Objective-C; đào tạo Objective C cho
iOS đã trở thành môyj ngành quan trọng; có những công ty chỉ tập trung vào ngôn ngữ
lập trình này (và iOS). Do Swift chắc chắn sẽ thay thế hoàn toàn Objective-C, các nhà
phát triển ứng dụng iOS sẽ mất một khoảng thời gian đáng kể để làm chủ ngôn ngữ
mới của Apple. Điều này có thể làm giảm tốc độ phát triển của hệ sinh thái ứng dụng
Apple.
Một mối lo ngại khác có thể kể đến là các ứng dụng rác. Do Swift sẽ giúp quá
trình phát triển ứng dụng trở nên dễ dàng hơn trước đây rất nhiều, số lượng ứng dụng
chất lượng kém xuất hiện trên gian hàng App Store có thể sẽ ra tăng. Song, đây cũng
không hẳn là một mối lo ngại thực sự cho Apple và người dùng của Quả táo. Trải qua
giai đoạn chuyển tiếp này, Swift sẽ giúp mang các ứng dụng iOS và Mac lên một tầm
cao mới.
2.2. Biến, hằng số trong ngôn ngữ lập trình Swift
2.2.1. Những quy ước cơ bản trong ngôn ngữ lập trình Swift

• Cuối câu lệnh không cần dấu chấm phẩy “;” (giống ngôn ngữ lập trình Visual Basic).

Nhưng nếu muốn viết 2 câu trên cùng một dòng duy nhất, bạn cần phải sử dụng dấu
chấm phẩy.

• Phân biệt chữ HOA và chữ thường, nghĩa là biến X sẽ khác biến x
• Các phép tính: Cộng + ; Trừ - ; Nhân * ; Chia / ;
• Các toán tử so sánh: Bằng == ; Không bằng != ; Lớn hơn > ; Lớn hơn hoặc bằng >= ;
Bé hơn < ; Bé hơn hoặc bằng <= ;
• Dấu = tương đương phép gán, khi bạn viết a = 1 nghĩa là giá trị 1 sẽ được gán cho biến
a
• Giữa biến và toán tử nên cách nhau một khoảng trắng “ ”. Khi tạo thói quen viết như thế
này còn giúp các bạn dễ dàng hơn trong việc đọc code, kiểm tra lỗi.
2.2.2. Biến (Variable) và Hằng số (Constant), cách khai báo biến và hằng số

• Biến (Variable): là vùng trống trong bộ nhớ máy tính dành cho một kiểu dữ liệu nào đó
và có đặt tên. Giá trị của biến có thể thay đổi được. Để khai báo biến ta dùng từ khoá
var

19


• Hằng số (Constant): gọi đầy đủ là biến Hằng số, nó cũng là biến, có thể được khai báo
là biến thường hay biến con trỏ. Giá trị của hằng số không thể thay đổi được. Để khai
báo hằng số ta dùng từ khoá let
• Khi khai báo hằng số bạn phải gán cho nó một giá trị xác định. Một hằng số không được
phép rỗng.
2.3. Các kiểu dữ liệu trong ngôn ngữ lập trình Swift

Swift cung cấp đầy đủ các kiểu dữ liệu như trong Objective-C. Có các kiểu dữ liệu cơ
bản sau:









Character: dùng để chứa ký tự
String: dùng để chứa chuỗi
Int: dùng để chứa các số nguyên
Float: dùng để chứa các số có giá trị thập phân
Double: như kiểu Float nhưng có phần thập phân chính xác hơn
Bool: kiểu logic, mang 2 giá trị true hoặc false
Swift cũng cung cấp kiểu collection, Array và Dictionary. Trong Swift, chúng ta không

cần khai báo kiểu dữ liệu sẽ dùng.
Bạn có thể gán kiểu dữ liệu khi khai báo một biến hay hằng số mà bạn đã biết kiểu dữ
liệu sẽ được lưu.
Ví dụ:

2.3.1. Xử lý Chuỗi (String)

Các thao tác thường dùng với chuỗi:

• Tạo chuỗi rỗng: có thể dùng “” hoặc String()
• Kiểm tra chuỗi rỗng: dùng <ten chuoi>.isEmpty . Hàm này sẽ trả về kết quả true hoặc






false
Đếm độ dài chuỗi: countElements(<ten chuoi>)
Nối 2 chuỗi: dùng toán tử +
So sánh 2 chuỗi: dùng ==
Truyền biến vào chuỗi: dùng "\(
20


21


2.3.2. Ép kiểu dữ liệu

Swift là loại ngôn ngữ lập trình Strongly Typed Language nên kiểu giá trị của biến/hằng
sau khi khai báo sẽ không thể thay đổi hoặc pha trộn lẫn nhau, bạn buộc phải thực hiện ép
kiểu nếu thực hiện những phép toán giữa 2 giá trị khác kiểu dữ liệu.






Chuyển từ Chuỗi sang Số: <chuoi>.toInt()
Chuyển từ Số sang Chuỗi: String(<chuoi>)
Chuyển từ số Tự nhiên sang số Thực: Double(<so>)
Chuyển từ số Thực sang số Tự nhiên: Int(<so>)

Ví dụ:”


2.3.3. Mảng (Array) và Từ điển (Dictionary)

• Mảng (Array): là tập hợp các phần tử có cùng kiểu dữ liệu.
• Từ điển (Dictionary): là kiểu tập hợp trong đó có hai thành phần chính liên hệ với nhau
là khóa (key) và giá trị (value).
Cả hai đều sử dụng dụng cặp ngoặc vuông (brackets) “[ ]” để khai báo. Tuy nhiên có sự
khác nhau trong khai báo cũng như cách sử dụng của 2 kiểu này.
2.3.4. Mảng (Array)






Khai báo Mảng: var <ten mang> = [,,...,]
Truy xuất đến các phần tử trong mảng: <ten mang>[<stt phan tu>]
Thêm phần tử vào cuối mảng: <ten mang> += []
Thay giá trị phần tử trong mảng: <ten mang>[<stt phan tu>] = <gia tri>
Phần tử đầu tiên trong mảng có số thứ tự bắt đầu là 0. Bạn có thể gán kiểu dữ liệu

cho mảng khi khai báo nếu biết chính xác kiểu dữ liệu mà mảng sẽ chứa.
2.3.5. Mảng 2 chiều (Array of Array):

Khai báo:

22


• Lấy giá trị phần tử: <ten mang>[<stt phan tu>]

• Lấy giá trị của phần tử trong phần từ: <ten mang>[<stt phan tu>][trong>]
• Lấy giá trị phần tử cuối: <ten mang>.last
• Thay đổi giá trị phần tử: <ten mang>[<stt phan tu>][<stt phan tu ben trong>] = moi>
• Thêm phần tử: <ten mang> = [ [,, ... ,] ]
• Đếm số phần tử: <ten mang>.count
Ví dụ:

2.3.6. Từ điển (Dictionary)

• Khai báo: var <ten tu dien> = [<key 1>:<value 1>,<key 2>:<value 2>,...,n>:<value n> ]

• Truy xuất: <ten tu dien>[<key>]
• Thêm mới: <ten tu dien>[< key>] = <gia tri>
• Thay đổi giá trị: <ten tu dien>[<key>] = <gia tri>
23


• Xoá key: <ten tu dien>.removeValueForKey(<key>)
Bạn có thể gán kiểu dữ liệu cho mảng khi khai báo nếu biết chính xác kiểu dữ liệu mà
mảng sẽ chứa.
Ví dụ:

2.3.7. Từ điển 2 chiều

Khai báo:

• Truy xuất: <tên từ điển>:[<từ khoá>]

• Truy xuất 1 giá trị bên trong: <tên từ khoá>:[<từ khoá>]![stt phần tử]
• Thêm mới: <tên từ điển>[<khoá mới>] = [<giá trị m.1>, <giá trị m.1>, ... , m.n>]
• Thay đổi giá trị:

24


Ví dụ:

2.4. Table View và Navigation Controller.

Ứng dụng checklists được xây dựng trên hai thành phần UI(User Interface)
thường được sử dụng nhất trong IOS đó là: Table View và Navigation
Controller.
2.4.1. Table View

Table View là một thành phần của giao diện người dùng (User Interface –
UI) thông dụng trong ứng dụng iOS. Phần lớn các ứng dụng sử dụng Table View
để hiển thị danh sách dữ liệu (data). Ví dụ dễ hiểu nhất là 1 ứng dụng được xây
dựng sẵn trong điện thoại. Danh sách liên lạc của bạn được hiển thị dưới dạng
bảng (table). Một ví dụ khác nữa là ứng dụng Mail. Nó sử dụng Table View để
hiển thị hòm thư của bạn, và danh sách các emails. Không chi được thiết kế để
hiển thị chữ, Table View cho phép bạn hiển thị dữ liệu dưới dạng ảnh. Ứng dụng
Youtube và Airnbnb là những ví dụ điển hình của cách sử dụng đó.
25


×