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.
Nguồn
2010-03-19 14:30:42
+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