2012-04-17 4 views
0

에서 변수를 선언합니다 :기준은 목표 C

첫 번째 방법은

에서 MyClass.h

@interface MyClass : UIViewController{ 

    IBOutlet UILabel* _label; 
    NSString *myString; 
} 

두 번째 방법입니다

MyClass.m 

@interface MyClass() { 

    IBOutlet UILabel* _label; 
    NSString *myString; 
} 

@end 

입니다 내 질문은 무엇입니까 첫 번째 방법과 두 번째 방법의 차이점입니다.

두 번째 방법은 MyClass의 개인 변수를 만드는 것입니다. 첫 번째 방법은 어떨까요. 그것은 동일하거나 다른 것을합니다.

은 첫 번째 방법을 사용하면 헤더 파일에서 MyClass.h에 선언 것이다 방법이 문제

답변

1

에 나에게 조언을 주시기 바랍니다. 이 클래스를 사용하는 사람은 항상 헤더 파일을 가지므로 해당 인스턴스 변수가 표시됩니다.

구현 파일 인 MyClass.m에서 두 번째 방법으로 사용합니다. 따라서 .h 파일 만 사용하여 클래스가 포함 된 프레임 워크를 제공한다면 MyClass 클래스를 사용할 수는 있지만 인스턴스 변수는 알 수 없습니다.

1

@private 키워드를 사용하면 첫 번째 예제의 변수를 private으로 설정할 수 있습니다. 이는 클래스 확장에 변수를 추가하는 주요 요점이 아닙니다. 오히려 확장에 ivars를 추가하면 전달 선언을 사용하지 않고 원치 않는 종속성을 헤더에서 제거 할 수 있습니다.

예를 들어, MySpecialClassMySpecialClass.h에 정의되어 있으며 당신이 앞으로 선언 @class MySpecialClass, 또는 자신의 헤더 내부 MySpecialClass.h 헤더의 포함 하나를 요구 헤더에 그 일을, 개인 변수로 MySpecialClass *special을 추가합니다. 반면에 확장에 변수를 추가하면 두 번째 방법으로 구현 .m 파일에 MySpecialClass.h을 포함 할 수 있습니다. 따라서 앞으로 선언문과 불필요한 헤더 종속성을 피할 수 있습니다.

1

둘 중 두 번째 방법이 더 좋습니다. 첫 번째 방법은 클래스의 공용 인터페이스에 내부 구현 세부 정보를 입력해야합니다. 즉, 클래스의 사용자에게 세부 정보가 누설되어 캡슐화가 중단됩니다.

그러나 이제는 세 번째로 더 좋은 방법이 있습니다. 구현시 인스턴스 변수를 넣을 수 있습니다.

@implementation MyClass 
{ 
@private 
    IBOutlet UILabel* _label; 
    NSString *myString;  
} 

// method implementations 

@end