2012-12-14 4 views
1

이의 내가 두 클래스 (를 ClassA, ClassB가)목표 - C : 다른 클래스의 속성을 액세스

ClassA.h을 가정 해 봅시다

이제
@interface ClassA : SomeSuperClass 

@property (some Attributes) ClassB *classB; 
@property (some Attributes) NSString *someString; 

@end 

내 문제 : 나는 액세스하려는

classB 인스턴스의 NSString someString. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 나는 두 가지 해결책을 생각하고 있었다.

클래스 B로 프로토콜을 생성하고 classA가이 프로토콜에 응답하게했다. 이 프로토콜의 유일한 방법은이 문자열에 액세스하거나 변경하는 것입니다.

제가 생각해 본 두 번째 해결책은 classB의 인스턴스를 만든 후에이 문자열을 매개 변수로 제공 한 다음 classB에 참조를 저장할 수 있으며 원하는 경우 언제든지 변경할 수 있습니다.

가 알려줘 솔루션 모두가 나에게 (그냥 가정을 테스트하지 않았다)에 작업을 보이지만, 또한 나에게 잔인한 (특히 첫 번째)의 비트를 보인다 뭐죠 최고 고마워. 고마워.

+0

ClassB에 대한 인터페이스 예제를 제공해 주시겠습니까? CodaFi가 제안한 것처럼 약한 레퍼런스도 괜찮습니다. 당신이 뭔가를 가지고있는 한 : \ @property (nonatomic, retain) NSString * someString; .h 파일에 정의되고 .m 파일에 \ @synthesize someString (오버라이드와 함께)이 있으면 황금이어야합니다. 제 생각에는 ;-) – Thumper

+1

문자열에 "참조 저장"을 할 수없고이를 변경하고 참조가있는 곳으로 변경 내용이 전파 될 것으로 기대하십시오. NSSting은 변경 불가능하며, 하나를 "업데이트"하면 실제로 다른 주소로 새 NSS를 대체합니다. –

답변

2

B의 상위 (A)에 약한 참조를 만든 경우 잔인 함이나 보관주기를 만들지 않고도 해당 속성에 안전하게 액세스 할 수 있습니다.

@interface ClassA : SomeSuperClass 

@property (some Attributes) ClassB *classB; 
@property (some Attributes) NSString *someString; 

@end 


@implementation 

-(id)init { 
    if (self = [super init]) { 
     _classB = [[ClassB alloc]initWithParent:self]; 
    } 
} 

@end 

@class ClassA; 
@interface ClassB : SomeSuperClass 

@property (nonatomic, weak) ClassA *classA; 

-(id)initWithParent:(ClassA*)parent; 

@end 

#import "ClassA.h" 
@implementation 

-(id)initWithParent:(ClassA*)parent { 
    if (self = [super init]) { 
     _classA = parent; 
     NSLog(@"%@", self.classA.someString); //perfectly legal 
    } 
} 

@end 
+0

그럼 클래스 B에 매개 변수로 ClassA를 전달해야합니다. – c2programming

+0

@ c2programming 예. 작업 예제로 업데이트했습니다. – CodaFi

+0

빠른 응답을 보내 주셔서 감사합니다. – c2programming

관련 문제