[英]Objective-C Set Property from Another Class Returns Null
我正在尝试以不同的方式从我的int main()
初始化XYZPerson
中的属性firstName
和lastName
。 (我正在学习 OC 并探索初始化值的不同方法)
但是, NSLog
总是为firstName
返回null
。 我知道有很多与我类似的问题,但几乎所有问题都倾向于特定问题,而不是语言语法本身。
#import <Foundation/Foundation.h>
#import "XYZShoutingPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
XYZPerson *somePerson = [[XYZPerson alloc] init];
NSString *firstName = [somePerson firstName];
[somePerson setFirstName:@"Jonny"];
[somePerson setLastName:@"Appleseed"];
NSLog(@"%@ %@", firstName, [somePerson lastName]); // prints ```(null) Appleseed```
}
return 0;
}
@interface XYZPerson : NSObject
@property NSString *firstName;
@property NSString *lastName;
- (id)init;
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;
- (void)saySomething:(NSString *)greeting;
@end
我刚开始学习 Objective-C。 我知道这很可能是一个非常愚蠢的错误,所以请不要对我太苛刻......谢谢!
是的,这有效吗? 但我想知道为什么在设置它之前将它存储为本地属性不起作用?
firstName
指向的地址不是保持不变吗?
确实如此,这就是为什么您的代码不起作用的原因...
接下来的几轮是一些边缘,但希望能够让概念得到理解。
让我们从属性退后一步,只看变量,你拥有的属性只是变量,它们周围有一些代码,对这里发生的事情没有影响。
变量只是一个命名的box ,并且该 box 能够存储具有特定类型的东西的(计算机)表示,也就是value 。 例如声明:
int height;
是使用可用 [1] 框的指令,该框能够保存具有int
类型的事物的表示并命名该框height
。
当您分配给一个变量时,会发生什么已经在盒子里的东西被扔掉[2],然后被分配的值的副本被放在盒子里。
当您从变量中读取内容时,将复制框中的内容并将其返回给您。
现在不管盒子中存储的是什么类型的值,上面对过程的描述仍然是正确的。
在您的情况下,存储在您的盒子中的是NSString *
类型的值,这是一个引用或指针,它表示(无论计算机以何种方式)一个字符串,本质上该引用是字符串的表示。
现在考虑分配:
height = 42;
这总是将42
的表示分配给名为height
的变量/框——一个integer 文字总是表示相同的值 [3]。
对于字符串字面量也是如此,因此字面量@"Jonny"
始终表示字符串"Jonny"。
现在让我们看看您的代码并根据(底层)变量描述它在做什么(属性只是包装器):
NSString *firstName = [somePerson firstName];
将somePerson
的firstName
变量中的当前值复制到局部变量firstName
中。 根据您在代码中此时报告的内容, somePerson
的firstName
包含null
的表示,因此这就是复制的内容。
[somePerson setFirstName:@"Jonny"];
将@"Jonny"
的表示复制到somePerson
的firstName
变量中,扔掉已经存在的任何东西——在你的情况下是null
的表示
[somePerson setLastName:@"Appleseed"];
将@"Appleseed"
的表示复制到somePerson
的lastName
变量中
NSLog(@"%@ %@", firstName, [somePerson lastName]);
复制局部变量firstName
中的表示 - null
的表示 - 和somePerson
的lastName
- @"Appleseed"
的表示 - 并将它们传递给NSLog
以转换为可打印文本和 output。
您的误解可能源于听说NSMutableString
类型。 其中之一由一个框表示,其内容可以修改(也称为“变异”)而不是简单地替换。 NSMutableString
的表示是对其框的引用/指针,就像NSString
一样,但在这种情况下,框内的内容可以修改,而引用/指针将与框本身的名称保持不变改变。
希望这比它困惑的帮助更多。 (使用图片/白板更容易解释。)
[1] 计算机如何找到可用的盒子很有趣,但在这里并不重要。
[2]“扔掉”可能涉及很多,当你学习时你会发现母马,有一种叫做“垃圾收集”的东西,你会在 Objective-C 中的“ARC”一词下找到它。 但同样,这对你的问题并不重要......
[3] 那些老/有足够知识了解 FORTRAN 早期的人,他们希望 pipe 站起来说“啊,但是……”此时 go 站在角落里;-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.