【问题标题】:Changing the value of one object in an array is changing all of the objects in the array改变数组中一个对象的值就是改变数组中的所有对象
【发布时间】:2017-05-05 14:49:33
【问题描述】:

当我在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

在“Person.m”中,我重写了“money”属性的get/set方法:

   #import "Person.h"
    @implementation Person

    NSDecimalNumber* _Money;

    -(instancetype)initWithName:(NSString*)name andMoney:(NSDecimalNumber*)money{
        self = [super init];
        if(self){
            _Name = name;
            _Money = money;
        }
        return self;
    }

    -(NSDecimalNumber *)Money{
        return _Money;
    }

    -(void)setMoney:(NSDecimalNumber *)Money{
        _Money = 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"]]];

现在,我改变了一个人的钱和名字财产:

[[personArray objectAtIndex:5]setMoney:[NSDecimalNumber decimalNumberWithString:@"0.22"]];

[[personArray objectAtIndex:5]setName:@"terry"];

现在,该数组的所有 Person 的货币属性都已更改!

for (Man* man in personArray) {
    NSLog(@"%@--%@",man.Name,man.Money);
}

数组中每个人的money属性值为“0.22”!!

为什么??

【问题讨论】:

  • 提前致谢!对不起我的游泳池英语。

标签: objective-c arrays get set


【解决方案1】:

问题是您的NSDecimalNumber* _Money; 声明不是实例变量。它是一个文件全局变量。由于只有一个这样的变量,因此它的值将用于您的 Person 类的所有实例。所以它显示了最后设置的任何值。

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

@implementation Person {
    NSDecimalNumber* _Money;
}

// and the rest of your code

@end

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

NSDecimalNumber* _money;

类名以大写字母开头。

【讨论】:

  • 你的答案是正确的!非常感谢! 3 个月前我是一名 C# 编码员,我已将拼写更改为小写。再次感谢!
  • @Terence 前缀_ 是非常不典型的。而且,实际上,根本没有理由像这里描述的那样声明实例变量。这没有错,只是不需要而且现在很少这样做。
  • @bbum 在 Objective-C 中,在 ivars 前加上下划线实际上很常见,以帮助避免与属性名称发生命名冲突。
  • @rmaddy 我觉得他不需要再覆盖“money”属性的get/set方法,因为,如果他不覆盖manual,系统会帮他添加get /由default设置方法。
  • @liangju 不,给定问题中的代码,没有理由使用显式 setter 和 getter 方法。我只是解释了为什么代码不起作用。
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2020-08-11
  • 2022-01-01
  • 2022-01-18
相关资源
最近更新 更多