2011-12-12 2 views
8

클래스 초기 자로 설정하려는 BOOL 속성이 있습니다.올바른 BOOL 속성 설정 방법

@property (assign, nonatomic) BOOL isEditMode; 

- (id)init 
{ 
    . . . 
    [self setValue:NO forKey:isEditMode]; 
    return self; 
} 

컴파일러에서 "호환되지 않는 정수와 포인터 변환"경고를 표시합니다. 여기서 내가 뭘 잘못하고 있니?

답변

16

키 - 값 코딩 방법 setValue:forKey:은 개체를 인수로 받아들입니다. BOOL을 설정하려면 [NSNumber numberWithBool:NO] 값 개체에 숫자를 래핑해야합니다. 그러나 그렇게 할 이유가 거의 없습니다. 키 - 값 코딩은 이것을 달성하기위한 우회적 인 방법입니다. self.isEditMode = NO 또는 isEditMode = NO 중 하나를 사용하십시오. 후자는 init 메소드에서 바람직합니다 (setter는 객체가 완전히 설정되기 전에 바람직하지 않은 임의의 코드를 실행할 수 있기 때문에).

그러나 첫 번째 사항에 대해 자세히 설명합니다. 키 - 값 코딩이 이런 식으로 작동하는 이유는 유형 시스템이 때로는 객체이고 다른 때에 원시적 인 값을 나타낼 수 없기 때문입니다. 따라서 KVC는 항상 객체를 처리하고 필요에 따라 원시 값을 자동 저장합니다. 마찬가지로 [yourObject valueForKey:@"isEditMode"]을 수행하면 실제 값을 래핑하는 NSNumber 객체가 반환됩니다. 당신은 그러나

[self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"]; 

로 작성해야 할 것 -setValue:forKey:를 사용하려면

2

그냥 직접 값을 할당 할 수

isEditMode = NO; 
+2

'setValue : forKey :'는 NSObject의 메소드입니다. 모든 Cocoa 객체에 유효합니다. – Chuck

+0

KVC를 사용하여 BOOL 값을 설정하면 어떤 문제가 발생합니까? KVC는 물체에만 사용됩니까? – NSExplorer

+3

KVC를 사용하여 설정하는 경우 키는 문자열입니다. 'isEditMode'는 클래스의 실제 boolean입니다. 당신이 원하는 것은'@ "isEditMode"',이 ivar이라는 이름의 문자열입니다. –

2

말인지 생각 : 코드가 실제로 컴파일 할 경우

self.isEditMode = NO; 

(나는 목표 - C 꽤 새로 온 사람을 그래서 모르겠다.) setValue은 아마도 문자열 (@"isEditMode")에 대한 포인터를 취하고 다른 유형 (isEditMode, 예)이 아닌 포인터를 취한다.

+0

세터가 작동 할 것이지만 반드시 필요한 것은 아닙니다. OP는 클래스 이니셜 라이저에서 값을 설정하려고하고 그의 속성 설명에서 설정자를 다시 정의하지 않았다고합니다. – Jim

5

속성을 설정하는 올바른 구문은 단지

self.isEditMode = NO; 

이며,이 작업을 수행하는 절대적 이유가 없다 너의 상황에서.

은 당신이 init 방법에있어 이후, 난 강력하게

isEditMode = NO; 

이가있는 재정의 세터의 가능성을 피할 수에로, 무엇이든지 대신에 어떤 속성 액세스를 방지 직접 바르를 사용하는 것이 좋습니다 것이라고 말했다 객체가 이미 초기화를 완료했다는 가정을하게하는이 클래스 또는 하위 클래스에서 호출됩니다. 이와 동일한 이유로 -dealloc 내부의 부동산 접근을 피하기를 원합니다.