2010-03-19 27 views

Trả lời

13

Nó đã làm với bao biến danh sách đối số làm việc (va_list, xem như ... trong các thông số). Khi mã đang cố gắng trích xuất tất cả các giá trị trong danh sách, nó cần phải biết khi nào nên dừng (vì nó không biết có bao nhiêu giá trị). Chúng tôi biểu thị sự kết thúc của danh sách với một giá trị đặc biệt được gọi là "sentinel", thường là NULL. Bằng cách đó, khi mã xử lý xuất hiện trên một số nil trong số va_list, nó biết rằng mã đã đến cuối. Nếu bạn rời khỏi nil, bạn sẽ nhận được các lỗi lạ, vì mã sẽ chỉ tiếp tục đọc xuống ngăn xếp, diễn giải mọi thứ dưới dạng đối tượng, cho đến khi tìm thấy một số nil.

Điều này rất giống với lý do tại sao chuỗi C phải là NULL -terminated. Lưu ý:

Lưu ý rằng, các phương thức stringWithFormat: và tương tự printf không cần nội dung gửi, vì nó tính ra số lượng thông số cần dựa trên số lượng % công cụ sửa đổi có trong chuỗi định dạng. Vì vậy, nếu bạn đưa ra một chuỗi định dạng là @"hello, %@", thì nó sẽ chỉ tìm kiếm một đối số thừa, bởi vì chỉ có một% modifier.

+6

+1, nhưng tôi vẫn nghĩ rằng một trụ cột BSG ascii-nghệ thuật sẽ là cách mát hơn NULL cho sentinels – slf

3

Chức năng biến thể trong Mục tiêu-C không có cách xác định khi danh sách đối số của bạn kết thúc, ngoài việc cung cấp đối số nil.

+1

Hoặc một chuỗi định dạng. (Giống như trong C.) –

+1

Hoặc một số đối số rõ ràng. –

Các vấn đề liên quan