BOOL의 기본값


답변:


175

쓰면 기본값 이 없습니다.

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

쓰레기로 초기화됩니다.

그러나 BOOL ivar의 경우 초기화시 NO전체 인스턴스가 0으로 채워 지므로로 초기화됩니다 .

(참고 : ARC가 활성화되면 로컬 객체 포인터 는 항상 기본값을 nil갖지만 BOOL과 같은 비 객체 유형의 로컬 변수는 여전히 가비지로 초기화됩니다. 로컬 변수가 nil로 설정되어 있습니까? (Objective-C)를 참조하십시오 .)


1
비 ivar BOOL이 항상 동일한 쓰레기라고 믿을 수 있습니까? 아니면 다른가요? (즉, NSlog 문에서 '2'의 정수 값으로 평가되는 것을보고 있습니다.)
bentford

8
@bentford : 아니요.
kennytm

1
사소한 것 같지만 아는 것이 매우 중요합니다! 감사!!

1
@KennyTM "ARC가 활성화 된 BOOL과 같은 비 객체 유형은 여전히 ​​쓰레기로 초기화됩니다." 확실합니까? 제공하는 링크는 "객체를 할당 할 때 Objective-C 객체의 인스턴스 변수는 항상 0 (또는 nil)으로 설정됩니다."라고되어 있으며, 더 명확한 다른 참조를 찾을 수 없으므로 모두 모순적입니다.
Kristof Van Landschoot 2013 년

1
제 경우에는 BOOL 지역 변수가 0으로 설정되어 있습니다. 그러나 릴리스 모드에서 빌드하면 YES가됩니다.
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에 의해 자동으로 초기화되지만 지역 변수는 값을 전혀 얻지 못한다고 생각합니다. 그래도 [Line 164]를보세요. 지역 변수가 YES 또는 NO가 아니라 nil이 아닌가요? 믿을 수없는 (무작위) 쓰레기 가치라고 생각합니다. 이것이 다음 사람에게 도움이되기를 바랍니다. 나는 뭔가를 배웠지 만 나는 코멘트를 기대한다. 감사합니다. 행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.