2012-02-09 13 views
5

Thực tiễn tốt là khởi tạo biến thành nil?Có thực hành tốt để khởi tạo biến thành nil không?

Tôi hỏi rằng vì khi tôi chạy trình phân tích về dự án của mình, tôi nhận được cảnh báo.

NSString *q; 

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_step(statement); 
     selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)]; 
     sqlite3_finalize(statement); 
    } 

    sqlite3_close(database); 

    return q; //Undefined or garbage value returned to caller 

Khi tôi thay đổi mã cảnh báo đã biến mất:

NSString *q = nil; 
+1

Lưu ý rằng trình biên dịch phải phàn nàn lớn về mẫu đó. Một ý tưởng tốt hơn là không tái phát minh ra bánh xe bằng cách sử dụng API sqlite trực tiếp; có cả trình bao bọc bên thứ ba cung cấp cho bạn các API cấp cao hơn sẽ giúp phát triển nhanh hơn hoặc bạn có thể sử dụng Dữ liệu cốt lõi, điều này sẽ giúp bạn tích hợp tốt hơn với toàn bộ hệ thống. – bbum

+0

Cảm ơn bạn đã bình luận bbum. Bạn hoàn toàn đúng. – objlv

Trả lời

11

Nếu bạn đang sử dụng ARC thì con trỏ của bạn sẽ tự động được gán cho nil. Tuy nhiên, tôi không tin bạn đang sử dụng ARC trong trường hợp đó con trỏ sẽ có giá trị rác. Điều này là nguy hiểm bởi vì bất cứ ai được gọi là chức năng có thể nhận được kết quả và tin rằng con trỏ trỏ đến một cái gì đó hợp lệ vì nó không bằng nil.

Vì vậy ... Có, luôn khởi tạo con trỏ của bạn thành 0 hoặc giá trị hợp lệ.

Ví dụ 1 :: Tốt ví dụ nơi giao để nil đầu tiên là không cần thiết:

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease]; 

Ví dụ 2 :: Xấu ví dụ nơi giao để nil đầu tiên là không cần thiết:

UIViewController *myVC = nil; // dumb since next line assigns it to valid value 
myVC = [[[UIViewController] alloc] init] autorelease]; 

Ví dụ 3 :: Ví dụ về việc gán cho n vì nó sẽ c onditionally được một giá trị mới

UIViewController *myVC = nil; // :D 
if (someCondition) 
{ 
    myVC = [[[UIViewController] alloc] init] autorelease]; 
} 
... 
0

Có đó là hoàn toàn tốt đẹp. Nil chỉ là một cách khác để nói biến này không trỏ đến bất cứ thứ gì trong bộ nhớ.

5

Có. Nếu q không được khởi tạo đến nil, nó sẽ có một giá trị ngẫu nhiên, có thể giới thiệu các lỗi ẩn trong việc thực thi sau này.

+0

Tôi không thấy lý do tại sao giá trị bằng không là bất kỳ lỗi nào ít dễ bị lỗi hơn giá trị ngẫu nhiên. –

+0

@infact Ví dụ: nếu giá trị trả lại được sử dụng trong một khối sau hoặc được giữ lại bởi một số trường hợp khác, nó sẽ bị lỗi. – ZelluX

+0

Tôi nghĩ rằng họ đã thay đổi điều này trong iOS 5 để tự động khởi tạo biến thành không. –

0

Nó là một rất tốt thực hành để thiết lập bất kỳ biến một số giá trị được xác định trước khi nó được sử dụng. Không làm như vậy sẽ gây ra tất cả các loại vấn đề. Phần còn lại phụ thuộc rất nhiều vào các công cụ mà bạn đang sử dụng.

Trình biên dịch tốt sẽ cho bạn biết nếu bạn đang sử dụng một biến chưa được xác định trước khi bạn sử dụng nó hoặc nơi trình biên dịch không thể chứng minh rằng nó được xác định trước khi bạn sử dụng nó. Một trình biên dịch xấu (hoặc một trình biên dịch tốt được sử dụng bởi một nhà phát triển không biết cách sử dụng các công cụ của họ đúng cách) sẽ không làm điều đó. Với một trình biên dịch tốt, initialisation để nil hoặc NULL có thể ngăn chặn trình biên dịch từ làm công việc của mình đúng cách. Hãy xem xét ví dụ này, nơi mà bạn thực sự muốn mã để trả lại một NSString đó không phải là con số không nhưng đã không nhận được nó ngay:

NSString* result; 
if (condition) result = @"True"; 
else if (otherCondition) result = @"False"; 
return result; 

Dưới đây trình biên dịch có thể cảnh báo bạn bởi vì bạn có thể trả về một kết quả không xác định. Nếu bạn khởi tạo kết quả là nil, bạn vẫn có cùng một vấn đề mà bạn có thể trả về nil trong một hàm không phải trả về nil, nhưng trình biên dịch không thể cảnh báo bạn.

Mặt khác, nếu giá trị phải là không, hoặc nếu nil là giá trị chấp nhận được và bạn không đặt biến thành giá trị khác trong một số trường hợp, thì khởi tạo thành 0 là tốt và tốt thực hành.

Tóm tắt: Sử dụng trình biên dịch và thiết lập trình biên dịch đúng cách để nó sẽ cho bạn biết nếu bạn đang sử dụng các biến chưa được khởi tạo. Nếu bạn nhận được cảnh báo về các biến chưa được khởi tạo, hãy khắc phục sự cố, chứ không phải cảnh báo.

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