Delphi中TBoek对象数组赋值重复问题求助
为什么我的TBoek数组所有元素值都完全相同?
这问题我太熟了——你踩了Delphi里引用类型的经典坑!
看你的MaakArray代码,你只在循环外面创建了一次TBoek实例:boek := TBoek.Create;。这意味着整个循环过程中,你始终在操作同一个对象。每次循环把这个对象的引用赋值给arrBoeke[i],然后修改它的属性——本质上,数组里的所有元素都指向同一个内存地址的对象。最后不管你访问数组哪个索引,看到的都是最后一次循环修改后的属性值,自然全一样。
修复方法很简单:把对象创建移到循环内部
每次循环都生成一个全新的TBoek实例,这样数组的每个元素都会指向独立的对象,修改各自的属性就不会互相影响了。修改后的代码如下:
procedure TBoek.MaakArray; var i: integer; sTitel, sOuteur, sISBN, sUitgewer, sPrys, sI: string; boek: TBoek; begin for i := 0 to 9 do begin // 关键:每次循环创建新的TBoek实例 boek := TBoek.Create; {$REGION 'Parse JSON om eienskappe van boek te kry'} sI := IntToStr(i); sTitel := JSONFile.GetValue<string>('items[' + sI + '].volumeInfo.title'); try sOuteur := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.authors[0]'); except sOuteur := '<none>' end; try sISBN := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.industryIdentifiers[1].identifier'); except sISBN := '<none>' end; try sUitgewer := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.publisher'); except sUitgewer := '<none>' end; try sPrys := JSONFile.GetValue<string> ('items[' + sI + '].saleInfo.listPrice.amount'); except sPrys := '0'; end; {$ENDREGION} arrBoeke[i] := boek; with arrBoeke[i] do begin SetTitel(sTitel); SetOuteur(sOuteur); SetISBN(sISBN); SetUitgewer(sUitgewer); SetPrys(sPrys); end; end;///end of for loop end;
额外提醒:注意内存泄漏
因为你手动创建了TBoek实例,记得在不需要这个数组的时候,循环释放每个元素,避免内存泄漏:
var i: Integer; begin for i := 0 to High(arrBoeke) do begin arrBoeke[i].Free; arrBoeke[i] := nil; end; end;
简单总结一下:对象是引用类型,你之前的代码相当于给数组的每个位置都贴了同一个对象的地址标签,修改的都是同一个东西。把创建对象的代码移到循环里,每个位置才会对应独立的对象,问题就解决了。
内容的提问来源于stack exchange,提问作者Janrich Cronje
相关产品推荐
相关产品推荐

