Giá trị mặc định của BOOL


Câu trả lời:


175

Không giá trị mặc định nếu bạn viết

-(void)somemethod {
  BOOL x;  // <--- no default value

Nó được khởi tạo thành rác.

Tuy nhiên, đối với BOOL ivar , nó sẽ được khởi tạo NO, vì toàn bộ cá thể được điền bằng 0 khi khởi tạo.

(Lưu ý: Khi ARC được bật, con trỏ đối tượng cục bộ sẽ luôn có giá trị mặc định nil, nhưng các biến cục bộ của các loại không phải đối tượng như BOOL vẫn được khởi tạo thành rác. Hãy xem Biến cục bộ được đặt thành nil? (Objective-C) .)


1
Bạn có thể tin tưởng vào BOOL non ivar luôn là cùng một loại rác không? hay là nó khác? (. tức là tôi nhìn thấy nó đánh giá với giá trị số nguyên của '2' trong một tuyên bố NSLog)
bentford

8
@bentford: Không, bạn không thể.
kennytm

@bentford ivar được khởi tạo NOnhư đã đề cập ở trên. Tôi nghĩ bạn có nghĩa là var.
Raffi Khatchadourian

1
có vẻ là tầm thường nhưng rất quan trọng cần biết! cảm ơn!!
nghìn tỷ ngày

1
@KennyTM "các loại không phải đối tượng như BOOL có bật ARC sẽ vẫn được khởi tạo thành rác". Bạn có chắc chắn về điều đó không? Liên kết bạn cung cấp cho biết "Các biến cá thể của đối tượng Objective-C luôn được đặt thành 0 (hoặc nil) khi bạn cấp phát một đối tượng" và tôi không thể tìm thấy bất kỳ tham chiếu nào khác, rõ ràng hơn, vì vậy tất cả đều hơi mâu thuẫn với tôi.
Kristof Van Landschoot

24

Tôi đã thực hiện một số thử nghiệm của riêng mình bằng Xcode 5.1, OS X Mavericks 10.9.4. Đối với những người không biết ALog là một NSLog đã được sửa đổi. Dù sao, thử nghiệm đầu tiên là sử dụng isLandscapenhư một biến công khai, với @synthesize, được truy cập bởi bộ điều khiển chế độ xem gốc (hiển thị bên dưới). Thử nghiệm thứ hai đã không sử dụng @synthesizevà tôi, rõ ràng, đã từng self.isLandscapenhận được kết quả tương tự trong bảng điều khiển. Đầu ra bảng điều khiển nằm bên dưới mã của tôi. Thử nghiệm thứ ba đã sử dụng 'isLandscape' làm biến cục bộ bên trong một phương thức.

@interface MyClass : UIView // (subclass used in my UIViewController)

@property (nonatomic) BOOL isLandscape;  // < - - - testing this BOOL


@implementation MyClass

@synthesize isLandscape;

- (void)awakeFromNib
{
    [super awakeFromNib];
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

Những kết quả này là từ hai thử nghiệm đầu tiên…

2014-08-28 08:18:52.909 MyApp[493:60b] -[MyClass awakeFromNib] [Line 157] isLandscape == NO
2014-08-28 08:18:52.911 MyApp[493:60b] -[MyClass awakeFromNib] [Line 166] !isLandscape
2014-08-28 08:18:52.912 MyApp[493:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == 0

Trong THÍ NGHIỆM THỨ BA, 'isLandscape' không còn là tài sản nữa. Tôi đặt nó thành một biến cục bộ với kết quả thú vị:

- (void)awakeFromNib
{
    [super awakeFromNib];
    BOOL isLandscape; // < - - - testing this BOOL
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

Những kết quả này là từ thử nghiệm thứ ba…

2014-08-28 08:28:33.483 MyApp[581:60b] -[MyClass awakeFromNib] [Line 159] isLandscape != YES/NO
2014-08-28 08:28:33.486 MyApp[581:60b] -[MyClass awakeFromNib] [Line 164] isLandscape
2014-08-28 08:28:33.487 MyApp[581:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == -24

Tôi đoán các thuộc tính được khởi tạo bởi tôi hoặc Xcode tự động, nhưng các biến cục bộ không nhận được giá trị nào. Mặc dù vậy, hãy nhìn vào [Dòng 164] biến cục bộ không phải là CÓ hay KHÔNG mà nó không phải là con số không? Tôi đoán đó là giá trị rác (ngẫu nhiên) mà bạn không thể tin tưởng. Tôi hy vọng điều này sẽ giúp người tiếp theo. Tôi đã học được một cái gì đó nhưng tôi mong được nhận xét. Cảm ơn và chúc may mắn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.