2010-06-11 3 views
0

У меня есть глупая вопрос о передаче указателя.Передача указателя на функцию в объекте-c

Я это:

@interface MyClass : NSObject 
myobj* foo; 
-(void)doSomething:(myobj*)aObj; 
@end 

@implementation MyClass 
-(void)doSomething:(myobj*)aObj 
{ 
    cFuncCall(&aObj); //alloc memory and init the object 
} 

-(id)init 
{ 
    //init stuff... 
    [self doSomething:foo]; // foo retun 0x0!!! 
} 
@end 

почему возвращение Foo ноль ??? Он должен быть инициализирован cFuncCall! [обновление]

Да, проблема в том, что foo не изменяет внешний вид doSomething. Я попытался с myobj ** но Foo по-прежнему ноль ... Это реальный код:

Я объявляю FMOD::DSP *lowpassDSP; в интерфейсе класса. Не задано свойство.

Это функция, которая может инициализировать lowpassDSP. -(void)configFilter:(FMOD::DSP**)dsp { system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, dsp); baseChannel->addDSP(*dsp, 0); } и это вызов: [self configFilter:&lowpassDSP];

в configFilter переменная дсп правильно инициирована но lowpassDSP равна нулю после вызова configFilter.

+0

пожалуйста показать код 'cFuncCall' – swegi

+0

cFuncCall является частным API и я не код, но функция выделяет память и инициализировать объект. В doSomthing, aObj правильно выделен, и он отлично работает. – Chiodo

ответ

1

Прежде всего, ваш метод -init не определен правильно, возможно, это вызывает проблему (суперкласс вашего класса неправильно инициализирован). Ваши методы -init должны быть определены, как это в ObjC:

- (id)init { 
    if (self = [super init]) { 
    // do custom initialization here, perhaps [self doSomething:foo] if required ... 
    } 

    return self; 
} 

-Edit:

Ну, в Objective-C Я часто видел указатели, передаваемые объекты, как это (обратите внимание на указатель-to указатель обозначений), я не уверен, если это будет хорошо работать в ANSI C, а также для передачи указателей на методы, но вы можете проверить это:

- (void)callFunction { 
    NSError *error = nil; 

    [self doSomethingWithError:&error]; 

    if (error != nil) { 
     NSLog(@"error: %@", error]; 
    } 
} 

- (void)doSomethingWithError:(NSError **)error { 
    // do something ... 
} 
+0

Я знаю, извините. Я пишу метод, например. – Chiodo

+0

это должно устранить сбой. – swegi

2

проблема в том, что ваш объект переменной foo не изменяется вне doSomething:. Попробуйте следующее:

-(void)doSomething:(myobj**)aObjP 
{ 
    cFuncCall(aObjP); 
} 

-(id)init 
{ 
    //... 
    [self doSomething:&foo]; 
} 
+0

Другая проблема заключается в том, что 'foo' не объявляется в блоке экземпляров-переменных, поэтому это глобальная переменная, а не переменная экземпляра каждого экземпляра MyClass. Это приведет к неправильному поведению и, возможно, утечке памяти, если этот вопрос начнется, чтобы создать более одного экземпляра MyClass. –

+0

Да, проблема в том, что foo не изменяет вне doSomething. Я пробовал с myobj **, но foo по-прежнему ноль ... – Chiodo

+0

Хорошо, это моя вина. В createDSPByType функция возвращает NULL, потому что система не инициализирована. Сожалею! :) – Chiodo

Смежные вопросы