传递对象时数据丢失

Data Loss When Passing Object

提问人:tentmaking 提问时间:1/27/2017 最后编辑:tentmaking 更新时间:1/31/2017 访问量:103

问:

我有一个对象

@interface QuestionViewModel : NSObject

@property (nonatomic, assign) NSInteger questionId;
@property (nonatomic, strong) NSString *questionText;
@property (nonatomic, assign) NSInteger questionNumber;
@property (nonatomic, strong) NSArray *choices;

@property (nonatomic, strong) QuestionViewModel *nextQuestion;
@property (nonatomic, strong) QuestionViewModel *previousQuestion;

@end

我知道当我填充这个对象时,它是成功的,并且所有属性都已完全正确初始化。

但是,当我像这样传递这个对象时:

*这是一个不同的类(它不在上面定义的 NSObject 中)。

@property (nonatomic, strong) QuestionViewModel *currentQuestion;

- (void)nextQuestion
{
    [self loadQuestion:self.currentQuestion.nextQuestion];
}

- (void)loadQuestion:(QuestionViewModel *)question
{
    self.currentQuestion = question;
    .
    .
    .
}

question.nextQuestion并且是 .question.previousQuestionnil

为什么当我传递这个对象时,后续对象(nextQuestion 和 previousQuestion)会变为 nil?似乎该对象正在执行浅拷贝而不是深拷贝,但不确定。

似乎有一些我不知道的基础。

Objective-C NSProping 按指针传递

评论

1赞 Willeke 1/27/2017
根本不会复制对象。 指向一个问题,并且此指针被分配给 。签入 和 的值。questioncurrentQuestionnextQuestionself.currentQuestionself.currentQuestion.nextQuestionself.currentQuestion.nextQuestion.nextQuestion
0赞 tentmaking 1/27/2017
self.currentQuestion.nextQuestion.nextQuestion 为 nil。self.currentQuestion.nextQuestion 对列表中的第一个问题有效,但对所有其他问题无效。
0赞 Alex 1/28/2017
我认为您正在创建与它本身(QuestionViewModel)相同的对象的属性(nextQuestion,previousQuestion)这一事实正在创建某种递归问题。作为一种策略,这有点令人困惑。是否最好将 nextQuestion 和 previousQuestion 存储为单独的类实例,并在实例化它们的任何类中相应地更新它们?
1赞 Willeke 1/29/2017
不,将 nextQuestion 和 previousQuestion 存储为单独的类实例不是一个好主意。指向同一类的另一个实例是可以的。所有问题是否都正确初始化?他们是否指向下一个和上一个问题?
1赞 Willeke 1/31/2017
我认为您没有正确设置下一个和上一个问题。您不仅会丢失数据。当对象的地址作为参数传递时,对象不会更改。

答:

0赞 Alex 1/27/2017 #1

我认为您需要先初始化子类 NSObject。在文件中,您可以重写 init 方法。像这样的东西:QuestionViewModelQuestionViewModel.m

- (id)init {
    if((self = [super init])) {
        // Set whatever init parameters you need here
    }
    return self;
}

然后,在尝试使用此方法的类中,只需调用:

-(void)viewDidLoad {
    QuestionViewModel *currentQuestion = [[QuestionViewModel  alloc] init];
}

评论

0赞 tentmaking 1/27/2017
我实现了这个,但它没有区别。这些属性仍然为零。不过,修复的尝试很好。
0赞 tentmaking 1/31/2017 #2

我最终更改了模型以更紧密地反映链表。当我存储上一个和下一个对象时,它很接近,但我最终更改了上一个和下一个属性来存储对象的索引,而不是实际对象。

@property (nonatomic, assign) NSInteger nextQuestionIndex;
@property (nonatomic, assign) NSInteger previousQuestionIndex;

评论

0赞 Willeke 1/31/2017
您确实存储了地址。 是一个指针。QuestionViewModel *