I am calling a method that goes in a background thread:
[self performSelectorInBackground:@selector(loadViewControllerWithIndex:) withObject:[NSNumber number
Most likely the reason for this is because the leaked object (an NSNumber), is a parameter passed in from outside the thread. Hence, this variable belongs to the calling thread (and its autorelease pool)
The reason that the autorelease pool around the thread call doesn't work, is because the thread creator (performSelectorInbackground) - returns immediately, most likely while the thread is still running.
I suggest you do a release on your selector's parameter after passing it in as an argument.