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