2013-07-17 4 views
0

Я использую протокол с некоторыми необязательными методами.Ошибка при вызове опционального метода протокола

@protocol PhotoDropDownDelegate <NSObject> 

@optional 
    - (void)getEditResult:(NSString *)status; 
    - (void)getImageForDiagram:(UIImage *)image andImagePath:(NSString *)imagePath; 
    - (void)dismissPhotoDropDown; 

@end 

поручаю это для класса

photoDropDownViewController.photoDropDownDelegate = self; 

Я использую только один метод

- (void)getImageForDiagram:(UIImage *)image andImagePath:(NSString *)imagePath 
{ 
    // Make a Image on center of screen 
    PhotoLayer *photoLayer = [PhotoLayer nodeWithLengthOfShape:300 andHeight:200 andPathToImage:imagePath]; 
    photoLayer.position = ccp(400, 500); 
    photoLayer.nameObject = [self makeNewName_ForShape];  
    photoLayer.isSelected_BottomRightElip = YES; 
    photoLayer.isSelected = YES; 


    [photoLayer doWhenSelected_Elip_BottomRight]; 
    [photoLayer show_Elip]; 

    [list_Shapes addObject:photoLayer]; 

    [self addChild:photoLayer]; 
    photoLayer = nil; 

    // Set Button Delete 
    selected_GerneralShapeLayer = (GerneralShapeLayer *) [list_Shapes lastObject]; 
    [self updateStatusForButtonDelete]; 
} 

Затем компилятор показать ошибку:

[AddDiagramLayer dismissPhotoDropDown]: unrecognized selector sent to instance 0xb2a8320'

, когда я реализую другие методы исчезнут ошибка

-(void)getEditResult:(NSString *)status { 

} 

-(void)dismissPhotoDropDown { 

} 

Как я уже знал, если метод в @option мы можем использовать его или нет. Я не понимаю, что здесь произошло. Может кто-нибудь объяснить мне

+0

Ну, даже если вы сделаете это необязательным, если вы попробуете назвать его, будет проблема правильно? – Desdenova

+0

нет, я просто использую один из них. И не реализуйте другие, он сделает ошибку – user2434837

+0

Да, но, очевидно, вы попытались называть его '[AddDiagramLayer увольнениемфотографического]. Вы не можете, если не выполняете. – Desdenova

ответ

11

Все директивы @optional запрещает предупреждения компилятора, если дополнительные методы не реализованы. Однако, если вы вызываете метод, который класс не реализует, приложение все равно будет разбиваться, поскольку выбранный вами метод (метод) не распознается классом, поскольку он не реализован.

Вы можете обойти эту проблему путем проверки, реализует ли делегат метода перед вызовом:

// Check that the object that is set as the delegate implements the method you are about to call 
if ([self.photoDropDownDelegate respondsToSelector:@selector(dismissPhotoDropDown)]) { 
    // The object does implement the method, so you can safely call it. 
    [self.photoDropDownDelegate dismissPhotoDropDown]; 
} 

Таким образом, если объект делегата реализует дополнительный метод, он будет называться. В противном случае это не будет, и ваша программа будет продолжать работать как обычно.

Обратите внимание, что вы должны по-прежнему использовать директиву @optional для обозначения методов, которые являются необязательными для реализации, чтобы избежать предупреждений компилятора, когда вы их не реализуете. Это особенно важно для программного обеспечения с открытым исходным кодом или библиотек, которые будут распространяться среди клиентов, поскольку эта директива сообщает разработчикам, которые не читали вашу реализацию, но могут видеть только заголовок, что им не нужно реализовывать эти методы, и все будет хорошо.

+0

tks, это сработало. Tks за вашу помощь – user2434837

Смежные вопросы