точечная нотация и доступ к переменной экземпляра - PullRequest
1 голос
/ 22 сентября 2011

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

С помощью self.myVariable вы обращаетесь к переменной экземпляра myVariable, а myVariableДоступ к локальной переменной.Это не одно и то же.

Мне кажется, это очень смущает, особенно из-за Java.Может кто-нибудь объяснить мне, что он подразумевает под локальной переменной здесь?Это то же самое, что использовать это в Java?Если это то же самое, то в Java, если, скажем, у вас есть:

private int myVariable;

int testFunction(int m)
{
  myVariable = 3;
}

Это приведет к доступу к переменной экземпляра myVariable, поскольку в методе не определена локальная переменная.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Self.myVariable не обращается к переменной экземпляра (в большинстве случаев разницы не будет, есть исключения, например, когда у вас есть пользовательский установщик). Вместо этого он получает доступ к получателю собственности. Это эквивалентно:

[self myVariable];

Если вы хотите получить доступ к переменной экземпляра напрямую, вы можете использовать просто:

myVariable;

Если вы хотите получить доступ к переменной экземпляра другого объекта, вы можете сделать:

otherObject->myVariable;

Хотя, как говорит Калеб ниже в комментариях, это осуждается.

0 голосов
/ 22 сентября 2011

Хм ....Я не слишком уверен, о чем идет речь в определении, но локальная переменная определенно является переменной, определенной внутри метода.Если вы - класс, у которого переменная экземпляра обращается к переменной экземпляра, вам нужно просто продолжить и вызывать ее напрямую только по имени переменной экземпляра.Однако, если в методе определена локальная переменная, она получит локальную переменную вместо переменной вашего экземпляра.

Так, например,


@interface Class : NSObject
{
    int instanceVariable;
}

@end

@implementation Class

-(id)init
{
    if (self = [super init])
    {
        //You can access your instance variable like this
        instanceVariable = 1;
    }
}

@end

Кстати, чтобы использовать синтаксис точки, вы должны реализовать метод доступа или использовать @property и @ synthesize.


@interface Class : NSObject
{
    int instanceVariable;
}
@property int instanceVariable;
@end

@implementation Class
@synthesize instanceVariable;

-(id)init
{
…
}
@end
0 голосов
/ 22 сентября 2011

из того, что я знаю, хотя точечная запись - это просто новый способ доступа к вещам.до этого было бы [self myVariable], где, как и сейчас, вы можете сделать self.myVariable.Основное различие между целью c и java (по крайней мере, для этого вопроса) состоит в том, как значения или объекты передаются в этом вызове

ЦЕЛЬ C (см. раздел обмена сообщениями)

JAVA

"С помощью self.myVariable вы получаете доступ к переменной экземпляра myVariable, а с помощью myVariable - локальную переменную. Это не одно и то же."это имеет смысл, хотя я думаю, что это странно, это то, что они говорят

self.myVariable - переменная экземпляра класса (оказывается self)

myVariable - локальная переменная

foo.myVariable - переменная экземпляра класса foo

also remember "local" is the same as scope
so 
int x; //local variable to the class with a scope of the whole class

method foo{
int x; //local variable to the method with a scope of the method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...