objective-c - 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;
}
代码很简单:
- 从控制台获取输入并将其分配给局部变量
xyz
- 分配
xyz
给实例变量_str
- 改变局部变量的值
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
解决方案
让我们打个比方。把你的变量想象成站在停车场的人。现在将您的字符串对象想象为停车场中的汽车。
由于这些变量是指针,想象一下人们伸出手臂指向一辆特定的汽车。你有两个人戴着名牌。一个名称标签上写着“_str”,另一个上写着“xyz”。
以下步骤类似于您的代码:
- “xyz”人被告知指向标有“C”的汽车。
- “_str” 人被告知指向“xyz”人所指向的同一辆车。
- “xyz”人被告知要指向标有“omg”的汽车。
此时,“_str”家伙仍然指向“C”车。仅仅因为“xyz”人现在指向不同的汽车并不意味着“_str”人改变了他所指的东西。
您对代码的困惑似乎与类比的第 2 步有关。该行_str = xyz;
仅表示两个变量(人)现在都指向同一个对象(汽车)。这并不意味着它们现在是同一个变量。
推荐阅读
- python - 需要更好的套接字超时条件
- java - 将类对象列表映射到另一个列表
- nginx - Nginx:poxy_pass 不同的位置到不同的端口
- java - 如何将 int 转换为 String 并仍然计数?
- laravel - 如何在 Laravel 项目中本地化 SFC Vue.js 组件
- javascript - 初学者的问题是,这种 Reactjs 破坏模式比以前的方式更好吗?
- python - 如何使用python将word文件转换为pdf?
- r - 我是 R 语言的新手,我想获得 excel 等效公式?
- qliksense - 如何以安全的方式将数据导入 qlik sense cloud
- office365 - 使用 Power Automate 检查 Office 365 组中是否存在 Teams/SharePoint 用户