【问题标题】:Objective-C: Assigning local variable to instance variableObjective-C:将局部变量分配给实例变量
【发布时间】:2018-05-06 17:01:35
【问题描述】:

我开始使用Objective 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 分配给实例变量_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

【问题讨论】:

  • 你的目标是什么?如果是学习写 iOS 或者 macOS 应用,学习 objc 有更好的起点。这看起来像是来自一套非常古老的学习材料。

标签: objective-c


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多