Цель-C: Назначение локальной переменной переменной экземпляра - PullRequest
0 голосов
/ 06 мая 2018

Я начал с Задачи C, но я не в состоянии понять само базовое условие. Ниже мой код

@ interface

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_str;
}
-(void) print;
-(id) init;
@end

@ осуществление

#import "Person.h"

@implementation Person
-(id) init{
    self=[super init];
    char c[50];
    scanf("%s",c);
    NSString *xyz=[NSString stringWithUTF8String:c];
    NSLog(@"%p",xyz);
    _str=xyz;
    xyz=@"omg";
    NSLog(@"%p",_str);
    return self;
}
-(void) print{
    NSLog(@"%p",_str);
    NSLog(@"%@",_str);
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import <stdio.h>
int main(int argc, const char * argv[]) {
    Person *ob=[[Person alloc] init];
    [ob print];
    return 0;
}

Код очень прост:

  1. Получить ввод из консоли и назначить его локальной переменной xyz
  2. Назначить xyz экземпляру varaible _str
  3. Изменить значение локальной переменной xyz

Так как xyz и _str в основном являются указателями, я думал, что изменение значения xyz также изменит значение _str. Но я не вижу этого, хотя обе переменные указывают на одно и то же место!. Может кто-нибудь объяснить, как на самом деле работает назначение и почему обновление xyz не влияет на _str.

Выход:

My_console_input
2018-05-06 22:28:54.714327+0530 learn_objc1[8109:135801] 0x10051ceb0
2018-05-06 22:28:54.714833+0530 learn_objc1[8109:135801] 0x10051ceb0
2018-05-06 22:28:54.714878+0530 learn_objc1[8109:135801] 0x10051ceb0
2018-05-06 22:28:54.715014+0530 learn_objc1[8109:135801] My_console_input
Program ended with exit code: 0

1 Ответ

0 голосов
/ 06 мая 2018

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

Поскольку эти переменные являются указателями, представьте, как люди протягивают руку и указывают на конкретную машину. У вас есть два человека с именными бирками. Один тег имени говорит «_str», а другой - «xyz».

Следующие шаги аналогичны вашему коду:

  1. Парню из "xyz" сказано указать на машину с надписью "C".
  2. Парню "_str" говорят, что он указывает на ту же машину, на которую указывает парень "xyz".
  3. Парню из "xyz" говорят, что он указывает на машину с надписью "omg".

В этот момент парень _str все еще указывает на машину "C". Тот факт, что парень "xyz" теперь указывает на другую машину, не означает, что парень "_str" изменил то, на что он указывает.

Ваша путаница с кодом, кажется, связана с шагом 2 аналогии. Строка _str = xyz; просто означает, что обе переменные (люди) теперь указывают на один и тот же объект (автомобиль). Это не значит, что они теперь являются одной и той же переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...