One of the guys on the JEDI-SDL list narrowed it down and I managed to put together a small sample application that shows the Access Violation.

[pascal]program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TMyNotifyEvent = procedure of object;

TMyBaseWindow = class( TObject )
private
FOnRender: TMyNotifyEvent;
public
property OnRender: TMyNotifyEvent read FOnRender write FOnRender;
end;

TBaseInterface = class( TObject )
protected
procedure Render; virtual; abstract;
public
MainWindow : TMyBaseWindow;
constructor Create;
destructor Destroy; override;
procedure ResetInputManager;
end;

TMyInterface = class( TBaseInterface )
protected
procedure Render; override;
end;


{ TBaseInterface }
constructor TBaseInterface.Create;
begin
inherited;
WriteLn( 'TBaseInterface.Create' );
MainWindow := TMyBaseWindow.Create;
ResetInputManager;
end;

destructor TBaseInterface.Destroy;
begin
MainWindow.Free;
inherited;
end;

procedure TBaseInterface.ResetInputManager;
begin
WriteLn( 'ResetInputManager' );
MainWindow.OnRender := Render;
end;

{ TMyInterface }
procedure TMyInterface.Render;
begin
WriteLn( 'Rendering' );
end;

var
MyInterface : TMyInterface;

begin
MyInterface := TMyInterface.Create;

MyInterface.Render;

MyInterface.Free;
end.
[/pascal]

When executed, this code works in 1.9.4-1.9.8, but does not work in 2.0.0.

I have submitted a bug report to the FreePascal site and it is bug ID 3997.