2014-02-08 2 views
0

클래스 메서드 노출에 관한 학문적 질문이 있습니다. 분명히 이것에 대해 이해하지 못하는 부분이 있으며 알고있는 사람들로부터 명확한 설명을 원합니다.클래스 메서드 노출 및 속성 정의

배경 : ViewController 및 ClassB라는 두 클래스의 간단한 예가 있습니다. 클래스 B에는 returnArray라는 메서드가있는 배열이 들어 있습니다. ViewController는 배열의 데이터에 액세스합니다. ClassB.h 파일에서 returnArray 메서드를 노출했습니다.

질문 : 속성을 정의하지 않고도 ViewController에서 배열의 데이터에 액세스 할 수있는 이유는 무엇입니까? 나는 그 속성이 배열에 접근 할 수 있도록 getter를 생성 할 것이라고 생각했다. 예제 (메서드 만 노출)를 사용하면 @property를 만들지 않고도 데이터에 액세스 할 수 있습니다.

클래스 방법 :

ClassB.h

@interface ClassB : UIViewController 

+(NSArray *) returnArray; 
//@property (nonatomic, strong) NSArray *returnArray; 

ClassB.m

@implementation ClassB 

+(NSArray *) returnArray 
{ 
    NSArray *locationArray = @[@"Place1", @"Place2"]; 
    return locationArray; 
} 

ViewController.m

- (void)viewDidLoad 
{ 
    NSArray *location = [ClassB returnArray]; 
    NSLog (@"The count of the location is %d", [location count]); 
    NSLog (@"The second item in testArray is %@", location[1]); 
} 

인스턴스 방법 : 그것은 읽기 가치가 있도록 검토 답변 후

ClassB.h 
*/ 
{ 
    @private 
    NSArray *returnArray; 
} 
- (void)setReturnArray:(NSArray*)returnArray; 
-(NSArray *) returnArray; 
*/ 

@property (nonatomic, strong) NSArray *returnArray; 
@end 

ClassB.m - no change 
ViewController.h - no change 
ViewController.m 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Create instance of ClassB 
    ClassB *classB = [ClassB new]; 

    //Access the instance of returnArray 
    NSArray *location = [classB returnArray]; 

    NSLog (@"The count of the location is %d", [location count]); 
    NSLog (@"The second item in testArray is %@", location[1]); 
} 
+2

귀하의 질문이 무엇인지 잘 모르겠습니다. 배열을 반환하는 클래스 메서드를 호출하고 배열을 가져 오는 중입니다. 부동산은 무엇과 관련이 있습니까? 속성은 클래스의 인스턴스에 대한 getter/setter 메서드의 줄임말입니다. – jrturton

답변

0

북두칠성의 대답은, @property 및 클래스 방법의 차이를 해결합니다. 내 대답은 클래스와 인스턴스 메서드의 차이점을 알고 있다고 가정하고 관련 설정자와 getter로 인스턴스 변수를 만드는 것보다 @property을 만드는 것의 차이에 초점을 둡니다. returnArrayClassBNSArray 객체를 반환하는 공공 방법이기 때문에


이유입니다.

@property은 인스턴스 변수, 설정자 및 getter라는 세 가지를 동시에 만드는 편리한 방법 일뿐입니다. 도트 구문을 허용하는 보너스가 추가되었습니다.

@property NSArray *returnArray; 
:

@interface ClassB : NSObject { 
    @private 
    NSArray *returnArray; 
} 

- (void)setReturnArray:(NSArray*)returnArray; 
- (NSArray*)returnArray; 

이이 같은 수 있습니다 :

그러나 따로 일, 도트 구문의 끝에서, 모두가 당신이 @property을 선언하고있는

은 다음과 동등하게 동일

물론 도트 구문을 제외하고.

당신이 할 때 : 당신은 실제로 직접이 @property를 선언 할 때 만든 배열에 접근하지 않는

NSArray *myArray = classB.returnArray; 

.

@property을 선언 할 때 자동으로 생성 된 getter 메서드를 호출하면됩니다.

+1

* 도트 구문 *이 "등록 정보"와 함께 "일반적으로"사용되는 경우에도 이러한 개념은 서로 완전히 독립적입니다. 컴파일러는 클래스 메소드에 대해서도'ClassB.returnArray'를'[ClassB returnArray]'로 변환합니다. (나는 사람들이'MyClass * obj = MyClass.alloc.init'을 쓰는 것을 보았습니다.) –

+0

Wain과 ghgrif 둘 모두를지지합니다. 함께 그들은 내 질문에 대답했다. 내가 테스트 한 2 개의 예제 (클래스와 인스턴스)가있었습니다. 내 혼란이 만든 문제는 인스턴스 메서드도 공개했기 때문에 클래스 또는 인스턴스 (배열을 열거하기 위해 구문 차이는 무시함)와 관계없이 테스트되는 일반적으로 같은 결과를 얻었습니다. nhgrif의 코드를 사용하여 인스턴스 메서드를 노출하고 해당 코드와 비교하여 속성을 테스트했는지 확인할 수있었습니다. 이제 나는 더 나은 이해를했습니다. 두 가지 대답 모두 도움이되었지만 nhgrif가 조금 더 완성되었습니다. –

1

@property인스턴스 변수 및 연관된 접근 자 메서드 (정의 된 액세스/수정 기준)를 만들기위한 속기 표기입니다.

당신이 가지고있는 것은 클래스 메서드입니다.이 메서드는 내부적으로 배열을 생성하고 반환합니다.

그런 이유로 [instanceOfB array]; 대신 [ClassB returnArray];이라고 부르는 이유입니다.

이것은 완전히 다른 것입니다. 속성을 사용하려면 ClassB의 인스턴스를 만든 다음 속성에 액세스해야합니다. ClassB의 인스턴스를 만들 때 배열이 만들어 졌다고 가정하면이 작업을 수행 할 수 있습니다.