首页 > 解决方案 > Objective-C:将局部变量分配给实例变量

问题描述

我开始使用Objective C,但我无法理解基本的评估本身。下面是我的代码

@界面

#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

主文件

#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

由于两者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

标签: objective-c

解决方案


让我们打个比方。把你的变量想象成站在停车场的人。现在将您的字符串对象想象为停车场中的汽车。

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

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

  1. “xyz”人被告知指向标有“C”的汽车。
  2. “_str” 人被告知指向“xyz”人所指向的同一辆车。
  3. “xyz”人被告知要指向标有“omg”的汽车。

此时,“_str”家伙仍然指向“C”车。仅仅因为“xyz”人现在指向不同的汽车并不意味着“_str”人改变了他所指的东西。

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


推荐阅读