Objective-C:将局部变量分配给实例变量

时间:2018-05-06 17:01:35

标签: objective-c

我开始使用Objective C,但我无法理解基本的配置本身。 以下是我的代码

@interface

#import <Foundation/Foundation.h>

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

@implementation

#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分配给实例可变_str
  3. 更改局部变量xyz
  4. 的值

    由于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 :(得分:1)

让我们用一个类比。把你的变量想象成站在停车场的人。现在想想你的字符串对象就像停车场里的汽车一样。

由于这些变量是指针,想象一下人们伸出手臂指向一辆特定的汽车。你有两个人戴着名牌。一个名称标签说&#34; _str&#34;另一个说&#34; xyz&#34;。

以下步骤与您的代码类似:

  1. &#34; xyz&#34;小伙子被告知指向标有&#34; C&#34;。
  2. 的汽车
  3. &#34; _str&#34;那个家伙被告知指向那辆&#34; xyz&#34;家伙指着。
  4. &#34; xyz&#34;小伙子被告知指向标有&#34; omg&#34;。
  5. 的汽车

    此时,&#34; _str&#34;家伙仍然指着&#34; C&#34;汽车。仅仅因为&#34; xyz&#34;家伙现在指的是一辆不同的汽车,并不代表&#34; _str&#34;那家伙改变了他指向的东西。

    您对代码的困惑似乎与类比的第2步有关。行_str = xyz;只是意味着两个变量(人)现在指向同一个对象(汽车)。它并不意味着它们现在是同一个变量。