今更かもしれませんが、UIViewControllerのモーダル表示について ごく簡単に説明。

※ios5より[self  presentModalViewController:controlleranimated:YES];は非推奨となっているため下記のpresentViewControllerを使うのが望ましいと思います。基本的な使い方は同じです。またcompletion:でメソッドを呼ぶことができますが、必要が無ければnilを入れてください。

 例 [self presentViewController:controller animated:YES completion:nil];
戻りは[self.modalViewController dismissModalViewControllerAnimated:YES];としていましたが同様にdismissViewControllerを使いましょう。self.modalViewController はselfのみでOKです

(先般の記述で曖昧な部分があったため、修正しました^^;)
AViewController 及びBViewControllerに実装されているIBAction はそれぞれに定義しているbutton1,button2を押したときに呼ばれるものと想定してください。

親コントローラー(AViewController)、子コントローラー(BViewController)とします。

親コントローラーのボタン(button1)を押すと、子コントローラーが表示されるといった感じです。
また子コントローラー(BViewController)のボタン(button2)押すと子コントローラーが消え、親コントローラーが表示されます。

AViewController.h

#import <UIKit/UIKit.h>

#import "BViewController.h"

@interface AViewController : UIViewController <BViewControllerDelegate> {      // ←<BViewControllerDelegate>により親子関係を築きます
}

@property (strong, nonatomic) IBOutlet UIButton *button1;


- (IBAction)button1Action:(id)sender;

@end

AViewController.m

#import "AViewController.h"

@implementation AViewController

@synthesize button1;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

    }
    return self;
}

- (void)viewDidLoad {

    [super viewDidLoad];

}

- (void)viewDidUnload {

    [self setButton1:nil];

    [super viewDidUnload];

}

///----------- 中略----------------

- (void)backFromModalB {

// 子コントローラー(BViewController)にてbutton2を押したときにここを参照する。

[self.modalViewController dismissModalViewControllerAnimated:YES];                  // ←ここが重要(self.modalViewControllerにはBViewControllerが入っている)

}

- (IBAction)button1Action:(id)sender {
    // 子コントローラーを参照し、デリゲート設定する

    BViewController *controller = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];       // ←ここが重要

    controller.delegate = self;                       // ←ここが重要

    // 回転しながら子コントローラーを表示

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

    [self  presentModalViewController:controller animated:YES];        // ←ここが重要

}
@end

BViewController.h

#import <UIKit/UIKit.h>

@protocol BViewControllerDelegate <NSObject>   // ←ここが重要

- (void)backFromModalB ;                // ←AViewController.mにて実装されている

@end

@interface BViewController : UIViewController {

    _weak id <BViewControllerDelegate>delegate;                           // ←ここが重要

}

@property (nonatomic, weak) id <BViewControllerDelegate>delegate;   // ←ここが重要
@property (nonatomic, strong) IBOutlet UIButton *button2;
- (IBAction) return:(id) sender;

@end

BViewController.m

#import "BViewController.h"

@implementation BViewController

@synthesize delegate;

- (void)viewDidLoad {

    [super viewDidLoad];

}

- (void)viewDidUnload {

    [self setDelegate:nil];

    [super viewDidUnload];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}
- (IBAction) return:(id) sender {

    [delegate backFromModalB];        // ←ここが重要
}

@end

 ※注意 子コントローラーにてdelegate のpropertyを'strong' に設定すると循環参照となり、メモリリークとなります。