Your first variant is because somewhere you are getting a NSArray, not an NSMutableArray (probably when you first get the JSON). You probably want to use mutableCopy instead of arrayWithArray.
But all this is rather moot: You don't need to fuss with this. When you convert your first JSON into an array leave it as an array (unless you need to change its contents). Then when you get your second json array, just assign your array pointer to point to it, rather than the original. Something like this:
@property(nonatomic, strong) NSArray * myCurrentJson;
self.myCurrentJson = [mydownloadedJSonString JSONvalue];
Then later in your code when you get a fresh JSON array, just set:
self.myCurrentJson = [myNewDownloadedJsonString JSONvalue];
This way myCurrentJson always points to a valid json block, and you don't have to fuss with mutable because those arrays don't change. When you replace the array, the old one doesn't have any references anymore so ARC will free it in memory. If you need to mutate the value, just do a mutableCopy on the original array, and make your changes in that one.