Я пришел к какому-то способу смешивания C ++ и Objective-C (на самом деле Objective-C ++), но теперь я застрял.
Моя текущая проблема заключается в том, что переменная self ‘Objective-C’, кажется, не является правильной и выдает исключение в моем коде:
Exception: Invalid parameter not satisfying: target
Я полагаю, что ссылка на selfRef недопустима:
addTarget:selfRef
Как правильно инициализировать себя и сделать его доступным для функции C ++.
Это мой первый день, когда я касаюсь цель-с / цель-с ++, так что извините, если это элементарно;)
Код:
#import "ios_objc.h"#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioSession.h>
#import <MediaPlayer/MediaPlayer.h>
#import <MediaPlayer/MPRemoteCommandCenter.h>
id selfRef;
//static Ios_objc *selfRef; //I tried this as well.
@implementation Ios_objc
IosImpl::IosImpl(void) //: self( NULL )
{
}
IosImpl::~IosImpl(void)
{
[Ios_objc dealloc];
}
void IosImpl::init(void)
{
selfRef = [[Ios_objc alloc] init];
}
void IosImpl::enable(void)
{
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
commandCenter.playCommand.enabled = YES;
@try {
[commandCenter.playCommand addTarget:selfRef action:@selector(playSounds)];
}
@catch (NSException *exception) {
NSLog(@"Exception: %@", exception.reason);
}
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}
void IosImpl::playSounds()
{
NSLog(@"Play");
}
//I also tried 'Objective-C' style function signature.
//- (void) playSounds
//{
//
//}
@end
Я считаю, что исключение исходит из заявления в рамках реализации -[MPRemoteCommand addTarget:action:]
это выглядит примерно так:
NSParameterAssert(target);
То есть это подтверждает, что target
полученный параметр не являетсяnil
, Вот почему нечетная фраза «… параметр не удовлетворяет: цель». «цель» — это фактическое тестируемое условие, которое не удовлетворяет параметру. Если заявление было написано NSParameterAssert(target != nil);
тогда причина исключения должна была бы прочитать «… параметр не удовлетворяет: target! = nil», что было бы более понятным.
Во всяком случае, вы пишете (предположительно неnil
) значение до selfRef
в IosImpl::init()
, но как это называется? Конструктор не так, как написано в данный момент. Либо позвони init()
из конструктора или просто поместить этот код непосредственно в конструктор.
Кроме того, ваш деструктор не верен. Как в настоящее время написано, это звонит -dealloc
на Ios_objc
Класс объекта, который вряд ли что-то сделает (и, если он это сделает, то ничего хорошего). Ты наверное имел ввиду [selfRef release]
(нота: release
не dealloc
). В общем, вы никогда не должны звонить -dealloc
кроме как позвонить super
в реализации вашего собственного -dealloc
метод.
Других решений пока нет …