It is hard to guess what happens, but one possibility is the following:
Table view cells are re-used. So when you add, e.g., a subview to a table view cell, and the corresponding row of the table view is scrolled out of the screen, the cell (with the subviews!) is put back into the re-use pool. If a new table row should be shown, chances are that the now unused cell (with the old subviews) is taken from the re-use pool, and the old subviews will be shown.
What could you do in this case is to "prepare a table view cell for re-use", using the method
- (void)prepareForReuse
In this method, you could remove all old subviews, see the docs.