ค่าเริ่มต้นของ BOOL


คำตอบ:


176

นอกจากนี้ไม่มีค่าเริ่มต้นถ้าคุณเขียน

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

เริ่มต้นเป็นขยะ

อย่างไรก็ตามสำหรับBOOL ivarมันจะเริ่มต้นNOเป็นเนื่องจากอินสแตนซ์ทั้งหมดเต็มไปด้วย 0 เมื่อเริ่มต้น

(หมายเหตุ: เมื่อเปิดใช้งาน ARC ตัวชี้วัตถุในเครื่องจะมีค่าเริ่มต้นnilเสมอ แต่ตัวแปรโลคัลของประเภทที่ไม่ใช่อ็อบเจ็กต์เช่น BOOL ยังคงถูกกำหนดค่าเริ่มต้นเป็นขยะโปรดดูตัวแปรในเครื่องที่ตั้งค่าเป็นศูนย์? (Objective-C) )


1
คุณสามารถนับ BOOL ที่ไม่ใช่ไอวาร์เป็นขยะเดียวกันได้หรือไม่? หรือมันต่างกัน? (เช่นฉันเห็นว่ามันประเมินเป็นค่าจำนวนเต็มของ '2' ในคำสั่ง NSlog)
bentford

8
@bentford: ไม่คุณทำไม่ได้
kennytm

1
ดูเหมือนจะเป็นเรื่องเล็กน้อย แต่สำคัญมากที่ต้องรู้! ขอบคุณ !!
trillions

1
@Kenny ™ "ประเภทที่ไม่ใช่วัตถุเช่น BOOL ที่เปิดใช้งาน ARC จะยังคงถูกกำหนดให้เป็นขยะ" คุณแน่ใจหรือไม่? ลิงก์ที่คุณระบุระบุว่า "ตัวแปรอินสแตนซ์ของออบเจ็กต์ Objective-C ถูกตั้งค่าเป็น 0 (หรือศูนย์) เสมอเมื่อคุณจัดสรรอ็อบเจกต์" และฉันไม่พบข้อมูลอ้างอิงอื่นใดที่ชัดเจนกว่าดังนั้นมันจึงขัดแย้งกับฉันเล็กน้อย
Kristof Van Landschoot

1
ในกรณีของฉันตัวแปรท้องถิ่น BOOL ถูกตั้งค่าเป็น 0 นั่นคือไม่ใช่ แต่เมื่อสร้างในโหมดรีลีสจะเป็นใช่
ngn999

24

ฉันทำการทดลองด้วยตัวเองโดยใช้ Xcode 5.1, OS X Mavericks 10.9.4 สำหรับผู้ที่ไม่ทราบว่า ALog เป็น NSLog ที่แก้ไขแล้ว อย่างไรก็ตามการทดสอบแรกคือการใช้isLandscapeเป็นตัวแปรสาธารณะโดย@synthesizeที่จะเข้าถึงได้โดยตัวควบคุมมุมมองหลัก (แสดงด้านล่าง) การทดลองครั้งที่สองไม่ได้ใช้@synthesizeและเห็นได้ชัดว่าฉันเคยself.isLandscapeได้ผลลัพธ์เดียวกันในคอนโซล เอาต์พุตคอนโซลอยู่ด้านล่างรหัสของฉัน การทดลองที่สามใช้ 'isLandscape' เป็นตัวแปรท้องถิ่นภายในวิธีการ

@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);
}

ผลลัพธ์เหล่านี้มาจากการทดลองสองครั้งแรก ...

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

ในการทดลองที่สาม 'isLandscape' ไม่ใช่คุณสมบัติอีกต่อไป ฉันตั้งค่าให้เป็นตัวแปรท้องถิ่นพร้อมผลลัพธ์ที่น่าสนใจ:

- (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);
}

ผลลัพธ์เหล่านี้มาจากการทดลองครั้งที่สาม ...

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

ฉันคาดเดาคุณสมบัติเริ่มต้นโดยฉันหรือ Xcode โดยอัตโนมัติ แต่ตัวแปรในระบบไม่ได้รับค่าเลย ถึงอย่างนั้นให้ดูที่ตัวแปรโลคัล [บรรทัด 164] ไม่ใช่ใช่หรือไม่ใช่ แต่มันไม่ใช่ศูนย์? ฉันเดาว่ามันเป็นค่าขยะ (สุ่ม) ที่คุณไม่สามารถนับได้ ฉันหวังว่านี่จะช่วยคนต่อไป ฉันได้เรียนรู้บางสิ่งบางอย่าง แต่ฉันรอคอยที่จะแสดงความคิดเห็น ขอขอบคุณและขอให้โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.