繁体   English   中英

Objective-C 从另一个设置属性 Class 返回 Null

[英]Objective-C Set Property from Another Class Returns Null

我正在尝试以不同的方式从我的int main()初始化XYZPerson中的属性firstNamelastName (我正在学习 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];

somePersonfirstName变量中的当前值复制到局部变量firstName中。 根据您在代码中此时报告的内容, somePersonfirstName包含null的表示,因此这就是复制的内容。

[somePerson setFirstName:@"Jonny"];

@"Jonny"的表示复制到somePersonfirstName变量中,扔掉已经存在的任何东西——在你的情况下是null的表示

[somePerson setLastName:@"Appleseed"];

@"Appleseed"的表示复制到somePersonlastName变量中

NSLog(@"%@ %@", firstName, [somePerson lastName]);

复制局部变量firstName中的表示 - null的表示 - 和somePersonlastName - @"Appleseed"的表示 - 并将它们传递给NSLog以转换为可打印文本和 output。

您的误解可能源于听说NSMutableString类型。 其中之一由一个框表示,其内容可以修改(也称为“变异”)而不是简单地替换 NSMutableString的表示是对其框的引用/指针,就像NSString一样,但在这种情况下,框内的内容可以修改,而引用/指针将与框本身的名称保持不变改变。

希望这比它困惑的帮助更多。 (使用图片/白板更容易解释。)


[1] 计算机如何找到可用的盒子很有趣,但在这里并不重要。

[2]“扔掉”可能涉及很多,当你学习时你会发现母马,有一种叫做“垃圾收集”的东西,你会在 Objective-C 中的“ARC”一词下找到它。 但同样,这对你的问题并不重要......

[3] 那些老/有足够知识了解 FORTRAN 早期的人,他们希望 pipe 站起来说“啊,但是……”此时 go 站在角落里;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM