проблема области переменной класса с objc / какао? - PullRequest
1 голос
/ 20 апреля 2011

Компиляция в XCode 3.1.3 с использованием GCC 4, под Leopard 10.5.8, с 10.5 в качестве моей цели ...

У меня есть интерфейс, таким образом:

@interface testThing : NSObject { classContaininghooHa *ttv; }
@end

Иреализация, таким образом:

@implementation: testThing

- (void) instanceMethodMine
{
    [ttv hooHa]; // works perfectly, compiles, links, hooHa is invoked.
}

//    void cFunctionMine()
//    {
//        [ttv hooHa]; // compiler: 'ttv' undeclared (first use in this function) "
//    }

void stupidCFunctionMine((testThing *)whom) // whom is passed class 'self' when invoked
{
   [whom instanceMethodMine]; // compiles, links, works. :/
}

@end

Итак, мое понимание - явно ошибочное - заключалось в том, что если вы объявили переменную, идентификатор класса или иным образом, она была бы закрытой для класса, но внутри классавыполняется в основном как глобальный, хранящийся в выделенном экземпляре класса на время его существования.

Вот как это действует для методов objc.

Но в вышеприведенной функции c, также записанной вкласс, переменная кажется невидимой.Это не имеет смысла для меня, но это так.

Может кто-нибудь объяснить мне, что происходит?

Пока вы занимаетесь этим, как я могу объявить это какпеременная экземпляра, поэтому я могу использовать метод в функции ac, объявленной в области видимости класса, как показано выше, а также в методах?

Понимание того, что высоко ценится.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Не имеет значения, где вы декларируете / определяете свои "нормальные" функции c.Они не являются частью класса, они просто старые функции c.Никакой связи с классом вообще.Передача экземпляра, над которым они работают, является обходным решением, если вы действительно не хотите превращать эту функцию в настоящий метод target-c.

0 голосов
/ 20 апреля 2011

interface методы имеют полный доступ к переменным-членам.И функция C не является частью класса, и поэтому она не может получить доступ к каким-либо переменным класса, если не принимает экземпляр класса в качестве аргумента.

void cFunctionMine()
{
    [ttv hooHa]; // compiler: 'ttv' undeclared (first use in this function) 
}

Очевидно, cFunctionMine не является частью интерфейса.Так что это не то, что ttv для отправки сообщения hooHa.

Пока вы это делаете, как я могу объявить это как переменную экземпляра, чтобы я мог использовать метод внутри AC?Функция объявлена ​​в области видимости класса, как показано выше, а также в методах?

void cFunctionMine()
{
    // 1. Create an instance using alloc and init

    testThing *ttv = [ [testThing alloc] init ] ;
    [ttv hooHa] ; 

    // Now the above statement is valid. We have a valid instance to which 
    // message can be passed to.

    // .....

    [ ttv release ] ;
    // release the resources once you are done to prevent memory leaks.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...