[objective-c] BOOL의 기본값

BOOLObjective-C에서 변수 의 기본값은 무엇입니까 ?



답변

쓰면 기본값 이 없습니다.

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

쓰레기로 초기화됩니다.

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

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


답변

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이 아닌가요? 믿을 수없는 (무작위) 쓰레기 가치라고 생각합니다. 이것이 다음 사람에게 도움이되기를 바랍니다. 나는 뭔가를 배웠지 만 나는 코멘트를 기대한다. 감사합니다. 행운을 빕니다!


답변