簡體   English   中英

ARC通過C ++抽象層進行的Objective-C委派

[英]ARC Objective-C delegation through a C++ abstract layer

我正在編程由Objective-C實現的簡單跨平台C ++層(dylib)。 通過平台宏包括特定於平台的部分。

NSUserNotificationCenter需要委托模式來處理特定的操作,例如單擊通知。 我面臨的問題是,一旦我執行send ,便會發送通知,但此后實例立即卸載。 因此,onclick通知操作永遠不會被調用(didActivateNotification),相反它會因指針錯誤而崩潰。 我該如何進行這項工作?

注意: SomeObjectiveC.mm是位於我的應用程序中的類。 AppleUserNotificationManager.mNotificationManager+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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM