+3  A: 

This:

@implementation FirstView

SecondView *secondView;

... is most likely the source of your crash. You shouldn't define instance variables in the implementation. The compiler may allow it but the runtime will be confused and the instance variable will not be properly retained.

You should define it like:

@interface FirstView : UIViewController {
    SecondView *secondView;
}
@property(nonatomic, retain) SecondView *secondView;

...and use it like:

-(IBAction) goToSecondView:(id) sender{
   UIView *newView = [[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];
   self.secondView=newView;
   [newView release];
   [self.view addSubview:self.secondView.view];
}

For clarity you should also rename FirstView and SecondView to FirstViewController and SecondViewController because they are view controllers and not views themselves.

More generally, what you are trying to do is dangerous and difficult. You don't swap views by adding and removing them as subviews. You need to swap out view controller and their views using a UINavigationController or a UITabbarController. In Xcode File>New Project, there is a Navigation based project and a Tabbar based project templates. Either will provide you most of the code you need to implement a simple app using either controller.

It will be well worth your time to spend a day learning how to use these controllers properly. With your current design, your app will break if it gets much more than two views.

TechZen