Не знаю, зачем вы все это делаете, но этот код:
Class2 *class2_obj;
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error
Создает только указатель на объект определенного типа, но не создает экземпляр. Таким образом, доступ к нему и запрос его retainCount (что вы не должны делать в первую очередь) приведут к действительному сбою. Потому что это недопустимый объект (пока). Попробуйте сначала инициализировать его.
UPDATE:
если вы настаиваете на этом, вот что может сработать
Class2 *class2_obj = [[Class2 alloc] init];
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives retain count of 1
[class2_obj release];