Ваш метод правильный - indexPathForSelectedRow действительно возвращает nil, если ячейка не выбрана. Но если вы попытаетесь отправить сообщение объекту nil и использовать возвращенное значение, оно будет равно 0, поэтому вам нужно проверить, равняется ли значение пути нулю или нет, прежде чем пытаться получить из него строку ячейки:
NSIndexPath *path = [table indexPathForSelectedRow];
if (path){
row = [path row];
...
}
else{
// No cell selected
}
P.S. nil это просто типизированный 0, поэтому на практике это одно и то же.