As others have pointed out, there's a difference between someone paying for your time, and someone paying for a finished piece of work.
If someone is paying for your time, then they should understand that fixing bugs is one of the uses of that time.
However, if you've promised someone a working application, then it's your job to deliver it.
Now, there's a certain level of good faith here, and any reasonably-sized application has bugs. Certainly showstoppers mean that you haven't actually delivered what was promised, while at the same time, minor cosmetic issues may be more reasonable to have additional charges for. Also, there's a fine line between "bugs" and "feature requests" that has to be looked at.
But, at the end of the day, there's a communication happening here that's probably even more important than any of these considerations. Your client is telling you that the product you have delivered is unacceptable. This really means that there is a mismatch in the standards that you each have of the delivered product.
Now, if you're not being paid for time, and the delivered product does not do what is promised, you should probably fix the issues - as otherwise, you have not fulfilled your end of the contract.
But if his standards are actually unreasonable, and these are minor issues, you need to decide whether or not his continued business is worth the extra costs of dealing with him. Certainly in the future you should either adjust your estimates appropriately, or more specifically spell out what will be delivered (or possibly include a certain number of hours of minor bug-fixing, etc.). However, some customerrs just aren't worth it.
But before deciding that he's not worth it, also consider network effects and other related issues.
Or, to look at it another way, he is perfectly free to come to you and ask you to do bug fixes at no charge. You are perfectly free to either do them, or say no. You must both accept the consequences of these decisions, however.