2012-07-03 2 views
0

프로토콜 내에서 속성을 정의 할 때 컴파일러 경고를 제거 할 수 없습니다. 이상한 점은 두 개의 속성이 정의되어 있고 두 번째 속성 (첫 번째 속성은 값 형식 인 반면 개체 유형 임)에 대해서만 경고가 표시된다는 것입니다. 여기Objective-C 프로토콜 속성 컴파일러 경고

는 스크린 샷입니다 :

compiler warning http://i47.tinypic.com/wrc0lk.jpg

사람이 어떻게이 경고를 제거하는 말해 줄 수, 그리고 왜 발생합니까? 코드가 정상적으로 작동하고 있습니다. 단지 나를 괴롭게하는 경고입니다.

+1

당신은 게터/세터를 만드는'@의 synthesize'를 사용하지 않았습니다. (그리고 당신의 코드는'view' 속성에 접근하려고 시도하면 실패 할 것입니다.) UI는'view'를 찾을 수 없기 때문에 작동합니다. –

+0

'view'의 이름을'theView'와 같은 것으로 변경하면 어떻게 될까요? – trojanfoe

+0

나는 그것을 "view"라는 이름으로 지었다. 나는 다른 답을 써서 다음과 같이 설명했다 : – Kovasandra

답변

0

귀하의 문제는 컴파일러가 프로토콜에서 정의한 속성의 구현을 찾을 수 없다는 것입니다.

이런 이유로 프로토콜에 속성을 추가하는 대신 속성에 액세스하는 간단한 메서드와 설정하는 메서드를 정의하는 것이 좋습니다. 그러면 적절한 오류 메시지가 표시되고 도트 표기법을 사용할 수는 없지만 경고가 올바른 위치에 유지됩니다.

양자 택일로, 당신이 뭔가를 할 수있다 (하지만 교육적인 이유로 권장하지 않음) :

#import <objc/runtime.h> 

@protocol myProto 

@property (assign) int myProperty; 

@end 

@implementation NSObject(myProto) 

-(int) myProperty 
{ 
    return [objc_getAssociatedObject(self, "myProperty") intValue]; 
} 

-(void) setMyProperty:(int) myProperty 
{ 
    objc_setAssociatedObject(self, "myProperty", [NSNumber numberWithInt:myProperty], OBJC_ASSOCIATION_RETAIN); 
} 

@end 

@interface MyObj : NSObject<myProto> 

@end 

@implementation MyObj 

@dynamic myProperty; 

@end 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     MyObj *myObj = [MyObj new]; 

     myObj.myProperty = 10; 

     NSLog(@"%i", myObj.myProperty); 
    } 
} 
+1

나는 그것이 왜 권장되지 않는지 궁금해 ... – Peres

+0

@JackyBoy 나는 스토킹에 대해 무엇을 말했습니까? –

+0

나는 이미 너에게 말했다. 롤. 나는 아무도 스토킹하지 않는다. 게다가, 당신이 실제로 내가 누구인지를 쉽게 알기 쉽습니다. Btw, 당신이 실제로 블로그를 시작할 때, 나에게 이메일을 보내라. – Peres

2

프로그램에서이 속성의 이름은 view입니다. view이라는 게터와 setView이라는 세터가 있어야합니다. @synthesize을 사용하지 않으면이 두 가지 방법을 제공해야하며 이는 컴파일러 경고 이유입니다. 점 표기법을 사용하여 속성을 참조하지 않거나 getter 및 setter 메서드를 호출하지 않으므로 코드가 정상적으로 작동합니다.

+0

-1 첫 번째 문장은 '속성은 인스턴스 변수를 정의한 다음 도트 표기법을 사용하여 액세스하는 방법이다.' 틀린, 매우 매우 틀린. –

+0

@ 리차드 J. 로스 3 세, 죄송합니다. 무엇이 잘못 되었습니까? 나는 경고를 간단하게 설명하려고 노력했다. – Enrique

+1

'@ property'가하는 것은 모두 getter/setter 쌍을 정의하는 것으로 iVar에 링크 할 필요는 없다. 예를 들어 :'MyClass.new'는 매우 이상하지만 도트 표기법을 완벽하게 사용합니다. 점 표기법은 매개 변수를 사용하지 않고 값을 반환하는 모든 메서드에 적용될 수 있으므로 혼동을 줄 수 있습니다. –