【发布时间】:2017-06-12 12:40:42
【问题描述】:
我有一个对象
@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.previousQuestion 是 nil。
为什么当我传递这个对象时,后续对象(nextQuestion 和 previousQuestion)会变为 nil?似乎该对象正在执行浅拷贝而不是深拷贝,但不确定。
似乎有一些我不知道的基础知识。
【问题讨论】:
-
对象根本没有被复制。
question指向一个问题,这个指针被分配给currentQuestion。签入nextQuestionself.currentQuestion、self.currentQuestion.nextQuestion和self.currentQuestion.nextQuestion.nextQuestion的值。 -
self.currentQuestion.nextQuestion.nextQuestion 为零。 self.currentQuestion.nextQuestion 对列表中的第一个问题有效,但对所有其他问题为零。
-
我认为您正在创建与其自身(QuestionViewModel)相同类型的对象的属性(nextQuestion,previousQuestion)这一事实正在创建某种递归问题。作为一种策略,这有点令人困惑。将 nextQuestion 和 previousQuestion 存储为单独的类实例并在您实例化它们的任何类中相应地更新它们可能会更好吗?
-
不,将 nextQuestion 和 previousQuestion 存储为单独的类实例不是一个好主意。指向同一类的另一个实例是可以的。所有问题都正确初始化了吗?他们是否指向下一个和上一个问题?
-
我认为您没有正确设置下一个和上一个问题。您不仅会丢失数据。对象在其地址作为参数传递时不会改变。
标签: objective-c pass-by-reference pass-by-value nscopying pass-by-pointer