2010-05-27 5 views
86

Objective-C에서 변수 BOOL의 기본값은 무엇입니까? 당신이 쓰레기로 초기화된다BOOL의 기본값

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

를 작성하는 경우

답변

161

없는 기본 값이 있습니다. 모든 인스턴스가 초기에 0으로 채워진다

그러나 BOOL아이바 들어,, NO 초기화한다.

(참고 :.. ARC가 활성화되면, 지역 객체 포인터 항상 기본값 nil을 수 있지만 BOOL 같은 비 객체 유형의 지역 변수가 여전히 쓰레기로 초기화 Local variables set to nil? (Objective-C)보기)

+1

비 ivar BOOL을 항상 같은 쓰레기로 계산할 수 있습니까? 아니면 다른가요? (즉, NSlog 문에서 '2'의 정수 값으로 평가됩니다.) – bentford

+8

@bentford : 불가능합니다. – kennytm

+0

@bentford ivar은 위에서 언급 한 것처럼 'NO'로 초기화됩니다. 나는 당신이 var를 의미한다고 생각합니다. –

19

나는 Xcode 5.1, OS X Mavericks 10.9.4를 사용하여 내 자신의 실험을했다. 알지 못하는 사람들은 수정 된 NSLog를 사용합니다. 어쨌든 첫 번째 실험은 @synthesize과 함께 공개 변수로 isLandscape을 사용하여 부모보기 컨트롤러 (아래에 표시됨)에서 액세스하도록했습니다. 두 번째 실험에서는 @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); 
} 

이러한 결과는 제 3 실험 '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 

는 더 이상 재산이었다 ... 처음 두 실험 없습니다. 나는 특성이 자동으로 나 또는 엑스 코드에 의해 초기화 얻을 같은데요

- (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 

있지만, 지역 변수 : 나는 로컬 흥미로운 결과가 변수가 될하도록 설정 전혀 값을 얻지 못한다. 그렇다하더라도, [Line 164]에서 로컬 변수는 YES 또는 NO가 아니지만 non-nil입니까? 나는 그것이 당신이 의지 할 수없는 (임의의) 쓰레기 값이라고 생각합니다. 나는 이것이 다음 사람을 돕기를 바랍니다. 나는 무언가를 배웠다. 그러나 나는 코멘트를 고대한다. 감사와 행운을 빕니다!