«Я» не является допустимой целью. Смешивание Objective-C и C ++ (Objective-C ++)

Я пришел к какому-то способу смешивания 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

0

Решение

Я считаю, что исключение исходит из заявления в рамках реализации -[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 метод.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]