NSMutableStringの、NSMutableDictionaryへの格納方法

NSMutableStringを使って一時的に格納してある文字列を、適度なタイミングでNSMutableDictionaryに格納しようと思って、とは言えインスタンスをそのまま格納するのでは後でStringの内容が変わったときに格納されたものもすべて変わってしまう、ということで

[dict setObject:[str copy] forKey:@"key"];

とやってみたら、メモリリークが起きた。これではダメなのか、と

[dict setObject:[NSString stringWithString:str] forKey:@"key"];

と変えてみたらリークがなくなった。
copyだとダメなのか…っていうかcopyって何なんだろう。何をコピーするのだろう。
まだまだ理解が足りない。