通过c++抽象层实现ARC Objective-C委托

ARC Objective-C delegation through a C++ abstract layer

本文关键字:ARC Objective-C 委托 实现 c++ 抽象 通过      更新时间:2023-10-16

我正在编程简单的跨平台c++层(dylib),由Objective-C实现。特定于平台的部分通过平台宏包含。

NSUserNotificationCenter需要委托模式来处理特定的操作,例如单击通知。我面临的问题是,只要我执行send,通知被发送,但实例卸载之后。因此,onclick通知动作永远不会被调用(didActivateNotification),而是因为一个坏的指针而崩溃。我该怎么做呢?

注意:SomeObjectiveC.mm是一个类位于我的应用程序。AppleUserNotificationManager.m是由NotificationManager+apple.mm初始化的,它们都位于我的Dylib中。

SomeObjectiveC.mm

Notification *notification = new Notification;
notification->setTitle("Foo bar notification");
notification->setMessage("Hello world!");
NotificationManager *notificationManager = new NotificationManager;
notificationManager->send(notification);

NotificationManager + apple.mm

#include "notificationManager+apple.hpp"
bool NotificationManager::send(Notification *notification)
{
    AppleUserNotificationManager *notificationManager = [[AppleUserNotificationManager alloc] init];
    NSString *title = [NSString stringWithUTF8String:notification->getTitle().c_str()];
    NSString *message = [NSString stringWithUTF8String:notification->getMessage().c_str()];
    if (notification->getSoundName().empty()) {
        [notificationManager sendWithTitle:title andMessage:message];
    }
    NSString *soundName = [NSString stringWithUTF8String:notification->getSoundName().c_str()];
    [notificationManager sendWithTitle:title andMessage:message andSound: soundName];
    return true;
}

AppleUserNotificationManager.m

#import "AppleUserNotificationManager.h"
@implementation AppleUserNotificationManager
@synthesize userNotification;
- (id)init
{
    [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate: self];
    userNotification = [[NSUserNotification alloc] init];
    self = [super init];
    return self;
}
/**
 *  @param NSUserNotificationCenter center
 *  @param NSUserNotification notification
 *
 *  @return bool
 */
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification{
    return YES;
}
/**
 *  @param NSUserNotificationCenter center
 *  @param NSUserNotification notification
 */
- (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification
{
    NSString *notificationText = [notification informativeText];
    NSString *urlRegEx = @"(http|https)://((\w)*|([0-9]*)|([-|_])*)+([\.|/]((\w)*|([0-9]*)|([-|_])*))+";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
    if ([urlTest evaluateWithObject:notificationText]) {
        [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:notificationText]];
    }
}
/**
 * @param NSString title
 * @param NSString message
 * @param NSString soundName
 */
- (void)sendWithTitle:(NSString *)title andMessage:(NSString *)message andSound:(NSString *)soundName{
    userNotification.title = title;
    userNotification.informativeText = message;
    userNotification.soundName = soundName;
    [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification: userNotification];
}
@end

在分配前使用self指针?
下面的改变能解决问题吗?

- (id)init
{
    self = [super init];
    [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate: self];
    userNotification = [[NSUserNotification alloc] init];
    return self;
}