Итак, если я вас правильно понимаю, ваши проблемы можно устранить, объявив протокол следующим образом:
@class SomeClass;
@protocol SomeClassDelegate <NSObject>
@required
- (void)thisObjectDidSomething:(SomeClass*)instance;
@optional
- (void)thisObjectDidSomethingUnimportant:(SomeClass*)instance;
@end
Тогда ваш делегат ivar и свойство выглядят так (используйте assign вместо слабого, если вы не используете ARC):
@interface SomeClass () {
__weak id<SomeClassDelegate> delegate_;
}
@property (weak) id<SomeClassDelegate> delegate;
И в файле .h любого класса, который собирается реализовать этот протокол, сделайте это:
@interface TCReader : NSObject <SomeClassDelegate> {
}
Поскольку безопасно вызывать селекторы для nil, для требуемых методов вы можете просто:
[self.delegate thisObjectDidSomething:self]
Но для дополнительных методов вам лучше:
if ([self.delegate respondsToSelector:@selector(thisObjectDidSomethingUnimportant:)]) {
[self.delegate thisObjectDidSomethingUnimportant:self]
}
Суть в том, что, объявляя и используя протокол, вы даете XCode знать, что эти методы определены для объектов, реализующих протокол. Если вам требуется, чтобы ваш делегат реализовал этот протокол, то XCode знает, что ваш делегат определил эти методы.