Tôi nghĩ, trong hầu hết các lớp, nếu giá trị trả về từ [super init] là không và bạn kiểm tra nó, theo khuyến nghị của các thông lệ tiêu chuẩn, và sau đó trả về sớm nếu không, về cơ bản, ứng dụng của bạn vẫn không hoạt động chính xác. Nếu bạn nghĩ về nó, mặc dù rằng nếu (tự! = Nil) kiểm tra là có, cho các hoạt động thích hợp của lớp học của bạn, 99,99% thời gian bạn thực sự làm cần tự là phi nil. Bây giờ, giả sử, vì bất kỳ lý do gì, [super init] đã trả về con số không, về cơ bản, séc của bạn đối với con số không về cơ bản là chuyển giao cho người gọi của lớp bạn, nơi nó có thể sẽ thất bại, vì nó sẽ tự nhiên cho rằng cuộc gọi là thành công
Về cơ bản, những gì tôi nhận được là 99,99% thời gian, nếu (tự! = Nil) không mua cho bạn bất cứ điều gì về độ mạnh mẽ hơn, vì bạn chỉ chuyển giao cho kẻ xâm lược. Để thực sự có thể xử lý việc này một cách mạnh mẽ, bạn thực sự sẽ cần phải kiểm tra trong toàn bộ hệ thống phân cấp cuộc gọi của bạn. Và thậm chí sau đó, điều duy nhất nó sẽ mua cho bạn là ứng dụng của bạn sẽ thất bại một cách sạch sẽ / mạnh mẽ hơn một chút. Nhưng nó vẫn sẽ thất bại.
Nếu một lớp thư viện tự ý quyết định trả lại con số không phải là kết quả của [super init], thì dù sao đi nữa, đó là một dấu hiệu cho thấy người viết của lớp thư viện đã phạm sai lầm khi thực hiện.
Tôi nghĩ rằng đây là một gợi ý mã hóa cũ, khi các ứng dụng chạy trong bộ nhớ hạn chế hơn nhiều.
Nhưng đối với mã cấp C, tôi vẫn thường kiểm tra giá trị trả về của malloc () so với con trỏ NULL. Trong khi đó, đối với Objective-C, cho đến khi tôi tìm thấy bằng chứng ngược lại, tôi nghĩ rằng tôi thường bỏ qua việc kiểm tra if (self! = Nil). Tại sao có sự khác biệt?
Bởi vì, ở cấp độ C và malloc, trong một số trường hợp bạn thực sự có thể phục hồi một phần. Trong khi tôi nghĩ trong Objective-C, trong 99,99% trường hợp, nếu [super init] không trả về con số nào, thì về cơ bản bạn vẫn đang xử lý nó, ngay cả khi bạn cố gắng xử lý nó. Bạn cũng có thể chỉ để ứng dụng bị sập và giải quyết hậu quả.