環境:Mac/High Sierra 10.13.6/swift4.2/xcode 10.0

下記コードでUIButtonをaddSubviewした時に、うまく動きません。
ViewController上でUIButtonを直接定義するとうまく動くことが確認できました。
また、BulbSwitchButtonクラス内のイニシャライザでViewControllerを引数で指定して、プロパティに追加(weak var vc:ViewController)すればうまくいくことも確認しました。
ただ、下記コードのようにViewController上で、他クラスのUIButtonプロパティをaddSubview()した時に、クリックしてもBulbSwitchButtonクラスのaction()が動作しない理由がわかりませんでした。

ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var bulb = Bulb(id: 1, state: true)
        var bulbSwitch = BulbSwitchButton(bulb: bulb)
        bulbSwitch.button.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/7, height: self.view.bounds.height/7)
        bulbSwitch.button.center = self.view.center
        self.view.addSubview(bulbSwitch.button)

        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    @objc func testAction(_ sender:UIButton){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }


}

Bulb.swift

import Foundation
import UIKit

class Bulb{
    let id:Int
    var state:Bool = false
    var image:UIImage?
    var imageView:UIImageView = UIImageView()
    var onFilename:String = "on"
    var offFilename:String = "off"

    init(id:Int){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        self.id=id
        self.setImage()
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    init(id:Int,state:Bool){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        self.state=state
        self.id=id
        self.setImage()
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    func setImage(){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        if self.state{
            self.image = UIImage(named: self.onFilename)
            self.imageView.image = self.image
        }else{
            self.image = UIImage(named: self.offFilename)
            self.imageView.image = self.image
        }
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }


    func on(){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        self.state = true
        setImage()
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    func off(){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        self.state = false
        setImage()
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    func setOnOff(state:Bool){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        if state{
            self.on()
        }else{
            self.off()
        }
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }
}


class BulbSwitchButton{
    let bulb:Bulb
    let id:Int
    var filename:String = "back"
    let button:UIButton = UIButton()

    init(bulb:Bulb){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        self.bulb = bulb
        self.id = self.bulb.id
        self.button.addTarget(self, action: #selector(action(_:)), for: .touchUpInside)
        self.button.setImage(UIImage(named: filename), for: .normal)
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }

    @objc func action(_ sender:UIButton){
        Logger.debug(Logger.Message.START_FUNCTION.rawValue)
        Logger.debug(Logger.Message.END_FUNCTION.rawValue)
    }
}