Có an toàn để đếm trên int
s luôn được khởi tạo tới 0 trong Mục tiêu-C không?Ints luôn được khởi tạo là 0?
Cụ thể hơn, khi một đối tượng có các vạch ngà int
mới được khởi tạo, có an toàn để giả định rằng các ngà của nó có giá trị 0 không?
Có an toàn để đếm trên int
s luôn được khởi tạo tới 0 trong Mục tiêu-C không?Ints luôn được khởi tạo là 0?
Cụ thể hơn, khi một đối tượng có các vạch ngà int
mới được khởi tạo, có an toàn để giả định rằng các ngà của nó có giá trị 0 không?
Có, biến mẫu lớp luôn được khởi tạo thành 0 (hoặc nil
, NULL
hoặc false
, tùy thuộc vào loại dữ liệu chính xác). Xem Objective-C 2.0 Programming Language:
Phương pháp
alloc
động cấp phát bộ nhớ cho các biến Ví dụ đối tượng mới và khởi tất cả 0-tất cả, đó là, ngoại trừ biếnisa
kết nối các trường hợp mới vào lớp của nó.
EDIT 2013-05-08
của Apple dường như đã loại bỏ các tài liệu trên (nay là liên kết tới Wayback Machine). Các (hiện tại) hoạt động tài liệu Programming With Objective-C chứa một trích dẫn tương tự:
Phương pháp
alloc
có một nhiệm vụ quan trọng khác, đó là để giải phóng bộ nhớ được phân bổ cho các thuộc tính của đối tượng bằng cách đặt chúng bằng không. Điều này tránh được vấn đề thông thường của bộ nhớ có chứa rác từ bất cứ thứ gì đã được lưu trước đó, nhưng không đủ để khởi tạo một đối tượng hoàn toàn.
Tuy nhiên, đây là chỉ đúng đối với các biến thể hiện của một lớp học; nó cũng đúng với nhiều loại POD tuyên bố ở phạm vi toàn cầu:
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
Với một ngoại lệ, đó là không đúng đối với các biến địa phương, hoặc cho dữ liệu được phân bổ với malloc()
hoặc realloc()
; điều này đúng với calloc()
, kể từ calloc()
số không rõ ràng trong bộ nhớ mà nó phân bổ.
Một ngoại lệ là khi tính năng đếm tham chiếu tự động (ARC) được bật, các con trỏ ngăn xếp đến đối tượng mục tiêu-C được khởi tạo ngầm thành nil
; tuy nhiên, vẫn còn thực hành tốt để khởi tạo chúng một cách rõ ràng thành nil
. Từ Transitioning to to ARC Release Notes:
stack biến được khởi tạo với
nil
Sử dụng ARC, mạnh, yếu, và autoreleasing stack biến hiện nay mặc nhiên khởi tạo với
nil
Trong C++ (và C++ đối tượng là được sử dụng trong Objective-C++), các biến mẫu lớp cũng là không phải là không được khởi tạo. Bạn phải khởi tạo chúng một cách rõ ràng trong (các) hàm tạo của bạn.
Tôi không nghĩ bạn nên giả định bất kỳ giá trị nào để khởi tạo. Nếu bạn đang xây dựng logic xung quanh một giá trị "0", bạn nên đặt nó để chắc chắn.
Tôi cho rằng chúng ta có thể xem đây là câu trả lời hợp lệ cho C++, trong khi câu trả lời của Adam áp dụng cho Objective-C? – Felixyz
Câu trả lời của Adam cho mục tiêu C là đúng - Mục tiêu C hoàn toàn guarentees rằng ivars được thiết lập để nil/NULL/false/0 về phân bổ và nó là hoàn toàn hợp lý để chấp nhận và sử dụng thực tế này. Ví dụ, điều này cho phép khởi tạo lười biếng lười biếng của NSMultableArray * ivars với [mảng NSMultableArray hoặc mới] khi chúng được chú ý là không. Kết hợp với guarentteing Objective [[NSMultableArray *) count] trả về 0, bạn thường có thể trì hoãn việc khởi tạo hơn nữa. Học cách yêu thích Objective C, không chỉ chống lại sự khác biệt của nó. –
Có, trong C toàn cầu vars được khởi tạo bằng không. Trong mục tiêu-C, ngay cả các vars cục bộ được khởi tạo bằng không. Bạn có thể tin tưởng vào nó.
@ Câu trả lời của AdamRosenfield trực tiếp mâu thuẫn với tuyên bố của bạn rằng ngay cả các vars cục bộ cũng được khởi tạo bằng không. Ai sai? –
Phát ngay. Tuy nhiên, thực tế là mọi người thường tự hỏi về chi tiết này có thể là lý do đủ để rõ ràng hơn về khởi tạo biến, cho là sự lựa chọn "an toàn hơn". Khởi tạo thành 0/nil/NULL không bao giờ làm tổn thương bất cứ ai ... :-) –
Tôi đồng ý với Quinn. Trong trường hợp này, tuy nhiên, tôi đang tạo một lớp "trừu tượng" mà không thực hiện - (void) init, và tôi không muốn buộc tất cả các lớp con nhớ để khởi tạo các ivars. Vì vậy, nó là tốt để biết rằng tôi có thể đếm trên chúng được khởi tạo để 0. – Felixyz
Kinh nghiệm của tôi ngay cả trong chế độ phát hành cho iOS là ngay cả các biến địa phương được khởi tạo để 0 – jjxtra