Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 更改数组中一个对象的值就是更改数组中的所有对象_Objective C_Arrays_Get_Set - Fatal编程技术网

Objective c 更改数组中一个对象的值就是更改数组中的所有对象

Objective c 更改数组中一个对象的值就是更改数组中的所有对象,objective-c,arrays,get,set,Objective C,Arrays,Get,Set,当我在Objective-C中重写get set时,如果该对象在数组中,如果我更改了其中一个对象的重写属性,则数组中的所有对象都已更改 我有一个名为Person的类: #import <Foundation/Foundation.h> @interface Person : NSObject @property(nonatomic,copy) NSString *Name; @property(nonatomic,copy) NSDecimalNumber* Money; -(i

当我在Objective-C中重写get set时,如果该对象在数组中,如果我更改了其中一个对象的重写属性,则数组中的所有对象都已更改

我有一个名为Person的类:

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property(nonatomic,copy) NSString *Name;
@property(nonatomic,copy) NSDecimalNumber* Money;

-(instancetype)initWithName:(NSString*)name andMoney:(NSDecimalNumber*)money;
@end
现在,我有一个与一些人的阵列:

NSMutableArray<Person*> *personArray = [[NSMutableArray alloc]init];

[personArray addObject:[[Person alloc]initWithName:@"11" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.1"]]];
[personArray addObject:[[Person alloc]initWithName:@"22" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.2"]]];
[personArray addObject:[[Person alloc]initWithName:@"33" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.3"]]];
[personArray addObject:[[Person alloc]initWithName:@"44" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.4"]]];
[personArray addObject:[[Person alloc]initWithName:@"55" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.5"]]];
[personArray addObject:[[Person alloc]initWithName:@"66" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.6"]]];
[personArray addObject:[[Person alloc]initWithName:@"77" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.7"]]];
[personArray addObject:[[Person alloc]initWithName:@"88" andMoney:[NSDecimalNumber decimalNumberWithString:@"0.8"]]];
现在,阵列中所有人物的货币属性都已更改

for (Man* man in personArray) {
    NSLog(@"%@--%@",man.Name,man.Money);
}
数组中每个人的货币属性值为0.22

为什么???

问题是你的NSDecimalNumber*没有钱;声明不是实例变量。它是一个文件全局变量。因为只有一个这样的变量,所以它的值用于Person类的所有实例。所以它显示最后设置的值

您需要将声明放在@implementation块中,如下所示:

@implementation Person {
    NSDecimalNumber* _Money;
}

// and the rest of your code

@end
仅供参考-变量名称应以小写字母开头:

NSDecimalNumber* _money;

类名以大写字母开头。

提前感谢!对不起,我的英语太差了。你的答案是currect!非常感谢你!3个月前我是一名C编码员,我已经将拼写改为小写。再次感谢@特伦斯和它是相当非典型的前缀与_。实际上,没有理由像这里所描述的那样声明实例变量。这并没有错,只是不需要,而且现在很少这样做。@bbum在Objective-C中,在IVAR前面加下划线实际上是很常见的,以帮助避免命名与属性名冲突。@rmaddy我认为他不需要再次重写money属性的get/set方法,因为如果他不手动重写,虽然系统将帮助他在默认情况下添加get/set方法。@liangju否,但没有理由在问题代码中给出显式setter和getter方法。我只是解释了为什么代码不起作用。
@implementation Person {
    NSDecimalNumber* _Money;
}

// and the rest of your code

@end
NSDecimalNumber* _money;