Классы

@protocol GameListener
-(void) gameStarted: (NSString *) name;
@end

@interface Game : NSObject{
    @private NSMutableArray<id<GameListener>> *listeners;
}
@property NSString *name;
-(void) addListener: (id<GameListener>) listener;
-(void) start;
-(id) initWithName: (NSString *) name;
@end

@implementation Game
-(void) addListener: (id<GameListener>) listener {
    [listeners addObject:listener];
}

-(void) start {
    for (id<GameListener> listener in listeners) {
        [listener gameStarted:self.name];
    }
}

-(id) initWithName: (NSString *) name {
    self = [super init];
    if (self) {
        self.name = name;
        listeners = [NSMutableArray new];
    }
    return self;
}
@end

@interface Statistic : NSObject<GameListener>
@property int startsCount;
@property NSString *lastGame;
@end

@implementation Statistic
-(void) gameStarted: (NSString *) name {
    self.startsCount++;
    self.lastGame = name;
}
@end

Statistic *statistic = [Statistic new];
Game *heroes = [[Game alloc] initWithName: @"Heroes"];
Game *doom = [[Game alloc] initWithName: @"Doom"];

//subscribe to events
[heroes addListener: statistic];
[doom addListener: statistic];

[doom start];
[heroes start];
//statistic.lastGame is "Heroes"
//statistic.startsCount is 2