2013-08-01 3 views
0

목표 C 질문 :대물 C 상속 및 setter

는 난의 ViewController의 수퍼 및 데이터 제어기의 수퍼 클래스가있다. 데이터 컨트롤러는 UpdateController가 업데이트되었을 때이를 알려주는 위임을 갖는다. 모두 작동하는 것처럼 보이지만 일부 로깅을 넣으면 매번 대리자 메서드가 두 번 호출되는 것 같습니다. 실제로 모든 SubDataController 인스턴스가 두 개 있다고 생각합니다. 어딘가에서 뭔가 잘못된 것을 만들어야합니다. 아무도 내가 뭘 잘못하고 있는지 볼 수 있니?

데이터 집약적 인 앱의 개별 화면이 있습니다. 각 뷰가 가지고 볼 수 있듯이

DmsProgressBaseViewController.h

@class DmsProgressDataController; 

@interface DmsProgressBaseViewController : UIViewController 

@property(readonly,assign,nonatomic)DmsProgressDataController *dataController; 
//index, so we be identified in container 
@property(assign,nonatomic)NSInteger index; 

@end 

DmsProgressBaseViewController.m

@implementation DmsProgressBaseViewController 

@synthesize dataController=_dataController; 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

-(DmsProgressDataController*)dataController 
{ 
    if(!_dataController){ 
     _dataController=[[DmsProgressDataController alloc]init]; 
    } 
    return _dataController; 
} 

..... 

@end 

: 나는 모두에서 상속의 UIViewController의 슈퍼 클래스가 있도록 사용자가 설정 한 나머지 서비스를 통해 데이터를로드하고이를 코어 데이터로 가져 오는 데이터 컨트롤러. .....

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 

-(void)loadDataFromRest 
{ 
    NSLog(@"loading %@",self.resourceUrl); 
    if(self.resourceUrl!=nil){ 
     [self loadDataFromRest:self.resourceUrl]; 
    } 
} 
.... 

#pragma mark - delegate methods 
-(void)notifyDataLoadedSuccessfully 
{ 
    if(self.delegate!=nil){ 
     [self.delegate dataLoadedSuccessfully]; 
    } 
} 
@end 

그래서 사람들은 슈퍼 클래스입니다 DmsProgressDataController.h

의 예를

@class AFHTTPRequestOperation; 
@class DmsProgressDataController; 

@protocol DmsProgressDataControllerDelegate 

-(void)dataLoadedSuccessfully; 

@end 


@interface DmsProgressDataController : NSObject 

@property(nonatomic,assign)id delegate; 
@property(nonatomic, strong)NSString *resourceUrl; 
-(void)loadDataFromRest; 
-(void)loadDataFromRest:(NSString*)resourceUrl; 
-(void)handleRestSuccess:(id)jsonResponse; 
-(void)handleRestError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation; 

//delegate method 
-(void)notifyDataLoadedSuccessfully; 

@end 

DmsProgressDataController.m @implementation DmsProgressDataController

을 : 또한에서 상속됩니다 하위 클래스는 다음과 같습니다. DmsProgressOverallViewController.h @class DmsProgressOverallDataController;

DmsProgressOverallDataController.h

@interface DmsProgressOverallDataController : DmsProgressDataController 

@end 

DmsProgressOverallDataController.m

012 다음으로 datacontroller

@interface DmsProgressOverallViewController : DmsProgressBaseViewController 

@property(readonly,strong,nonatomic)DmsProgressOverallDataController *dataController; 

@end 

DmsProgressOverallViewController.m

@interface DmsProgressOverallViewController()<DmsProgressDataControllerDelegate> 

@end 

@implementation DmsProgressOverallViewController 
@synthesize dataController=_dataController; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
[self.dataController loadDataFromRest:@"overall"]; 
    self.dataController.delegate=self; 
} 

-(DmsProgressDataController*)dataController 
{ 
    if(!_dataController){ 
     _dataController=[[DmsProgressOverallDataController alloc]init]; 
    } 
    return _dataController; 
} 
#pragma mark - datacontroller delegate method 
-(void)dataLoadedSuccessfully 
{ 
    NSLog(@"Overall data loaded successfully"); 
} 

@end 

충분한 정보를 제공하시기 바랍니다. 모든 도움을 주셔서 다시 한 번 감사드립니다.

+0

나는 용어를 뒤죽박죽이라고 지적하겠다. '@interface SuperViewController : UIViewController'는'SuperViewController'가'UIViewController'의 서브 클래스라는 것을 의미합니다. 'UIViewController'는'UIResponder'의 서브 클래스입니다. 그리고'UIResponder'는 기본 클래스 인'NSObject'의 서브 클래스입니다.** 편집 : **'SuperViewController'의 당신의 이름이'SubViewController' 클래스를 참조하고 있음을 봅니다. – bshirley

+0

문제의 대의원에 대해 더 자세히 알려줘야합니다. 우리는 그것에 대한 정보가 없습니다. 이것은 상속 또는 합성 문제가 아닙니다. – bshirley

+0

다른 말처럼, 코드는 읽기가 어렵습니다. SuperViewController는 실제로 UIViewController의 하위 클래스입니다. 그리고 우리가 모르는 SuperDataController를 사용합니다. –

답변

0

SuperViewController에도있는 인스턴스 변수 이름과 SubViewController의 속성 이름이 있습니다. 수퍼 클래스와 클래스 모두에서 속성 이름을 종합합니다. 무슨 일이 일어나고있는 것 같아요 SubViewClass에있는 _dataController는 SuperViewController에서 상속받은 _dataController입니다. dataController가 어떻게 사용되는지 볼 수있는 충분한 코드를 제공하지는 않지만 고유 한 ivar 및 특성 이름 (a)을 사용하면 읽기가 혼란스럽지 않고 (b) 이중 호출 문제가 해결 될 수 있습니다. 그것을 시도하고 볼!