2009-12-13 2 views
2

필자가 선호하는 Java의 기능 중 하나는 오토 복싱 (autoboxing)으로, 컴파일러가 프리미티브와 래퍼 클래스를 자동으로 변환합니다.intValue를 원할 때 실수로 NSNumber의 포인터를 사용하는 것을 방지하려면 어떻게해야합니까?

Objective-C/Cocoa에서 핵심 데이터 응용 프로그램을 작성 중이며 프로그래밍 방식으로 정수 속성을 처리하는 것이 실망 스럽습니다.

//img is a managed object that I have fetched 

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]]; 

내가 가끔 수행 intValue 메시지를 잊지 일어날 경우, stringWithFormat:에 전달되는 다음 INT 실제로 포인터 값 : 그 이유는.

문제는 완전히 자동으로 발생한다는 것입니다. 컴파일러 오류 또는 경고는 없습니다. 어리석은 어리석은 일이 문제 일 때 나는 너무 오랫동안 디버깅을 할 때가있다.

프로그래밍 스타일이나 컴파일러 설정을 변경하여 해당 트랩에 걸리지 않도록 할 수 있습니까?

편집 : 위의 예는 문제가 많은 곳 중 하나에 불과하다는 사실에 대해서는 분명하지 않았습니다. 다음은 문자열과 관련이없는 또 다른 가상의 예입니다.

엔터티 CollegeClass에는 courseNumberenrollmentLimit의 두 가지 정수 속성이 있습니다. 의 난 코스 번호를 비교하고 싶은 말은하자

//classFoo is a NSManagedObjects I've fetched 
if ([[classFoo [email protected]"courseNumber"] intValue] < 400) { 
    NSLog(@"undergraduate class"); 
} 

또는 유사하게, 나는 CS 부서에서 모든 클래스의 평균 등록 제한을 계산한다고 가정합니다.

답변

3

... CS 부서의 모든 수업의 평균 등록 한도를 계산하고 싶습니다.

NSArray's and NSSet's @avg operator과 함께하기 쉽습니다.물론, 그 문제 # 2에서 당신을 두는의 NSNumber를 반환합니다

의 난 코스 번호를 비교하려는 가정 해 봅시다 : 당신이 무슨 뜻 가정

//classFoo is a NSManagedObjects I've fetched 
if ([[classFoo [email protected]"courseNumber"] intValue] < 400) { 
    NSLog(@"undergraduate class"); 
} 

을 그 문제가 당신 위험은 intValue 메시지를 생략하므로 NSNumber 개체의 idint을 비교합니다.

컴파일러는 이러한 비교에 대한 경고를 제공합니다. Xcode에서 "Other C Flags"빌드 설정에 -Wextra을 추가하십시오. 경고 옵션에 대한 자세한 내용은 the full list of GCC warnings을 참조하십시오.

+0

이것은 내가 찾고있는 것입니다. 고맙습니다. –

7

% @을 사용하여 NSNumber를 % d 대신 문자열로 직접 변환 할 수 있습니다.

실제로 NSObject 기반 클래스를 가져 와서 믿을 수있는 문자열로 변환합니다.

+1

오브젝트에'descriptionWithLocale :'또는'description'을 보내고 그 메시지의 결과를 사용합니다. CF 객체 (CG 등)의 경우 객체에 대해 'CFCopyDescription'을 호출합니다. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1 –

+0

복잡한 점을 설명해 주셔서 감사합니다. 그것이 어떻게 작동했는지 알지 못한다. –

+0

+1 문자열 문제에 대해서는 좋은 생각이지만 문자열 만이 유일한 문제는 아닙니다. 더 많은 예제를 제공하기 위해 질문을 편집했습니다. –

3

이것은 코어 데이터를 처리 할 때만 적용 할 수 있지만 MOGenerator을 사용하여 코어 데이터 개체의 클래스를 생성하면 (어쨌든 권장 할 것임) -[propertyName]Value 메서드를 사용하여 올바른 값에 직접 액세스 할 수 있습니다. 그것은 이미되지 않은 경우, "유형 체킹이 printf/scanf 호출"경고에

// These two methods are identical when called on a class 
// which was generated with MOGenerator 
[[object imageID] intValue]; 
[object imageIDValue]; 
+0

나는 MOGenerator에 대해 들어 본 적이 없다. 그것은 좋은 생각이지만, 나는 더 바보 같은 것을 찾고 있습니다. 여기서 문제는 intValue를 사용해야한다는 것을 알고 있지만 때때로 잊어 버리는 것입니다. 숫자 데이터가 아닌 모든 속성에 대해 [propertyName] Value를 사용할 수있는 경우에만 작동합니다. 그런 다음 항상 자신을 재 훈련하여 항상 사용하십시오. –

0

켭니다 NSNumber의를 돌려 속성. 이것은 이 아니며 현재 NS/CFString 서식에 대한 도움이 필요합니다. 그러나 나는 그것을 위해 레이더 향상 요청 (x-radar : // problem/7375186)을 제출했습니다. 물론 직접 파일을 제출하실 수 있습니다.

관련 문제