Tkinter PhotoImageの参照の寿命について

PhotoImageでボタンの画像を作成しているコードにて、べた書きからクラス形式に変更したところ、画像が表示されなくなった。
どうもこういうことらしい。
Python 2.7 - [tkinter]canvasの写真を更新したい|teratail

import tkinter as tk

class MyWidget(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        frame1 = tk.Frame(self)
        imageicon = tk.PhotoImage(file='button.png')
        button = tk.Button(frame1, image=imageicon)
        button.pack()
        frame1.pack()

root = MyWidget()
root.mainloop()

→画像が表示されず、ボタンも反応しない

import tkinter as tk

class MyWidget(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        frame1 = tk.Frame(self)
        self.imageicon = tk.PhotoImage(file='button.png')
        button = tk.Button(frame1, image=self.imageicon)
        button.pack()
        frame1.pack()

root = MyWidget()
root.mainloop()

imageiconの参照をselfで持つことによって、rootが死なない限り破棄されなくなった模様
純粋なオブジェクト指向じゃない?ようなので、こういう仕様は恐ろしい・・・構文エラーでも実行時エラーでもなく、単に期待した動作をしない。
将来的にはリリース前にテストを通すかもしれないけど、これはスルーするかもしれない・・・。