Xcode 10-UIButton自定义释放属性在Swift 4中很弱

时间:2018-07-20 08:08:17

标签: ios swift uibutton

我已经使此代码完美地工作了,但仍然可以,但是我似乎看到了一条警告消息:

  

实例将被立即释放,因为属性“ selectButton”为   弱

这只是将按钮图像更改为不同的大小,具体取决于它是iPad还是iPhone,由于屏幕大小,我试图更改为:

  @IBOutlet var selectButton : UIButton?

然后将其添加到ViewDidLoad()中作为自定义按钮:

  selectButton = UIButton(type: .custom)

但是当应用编译时,图像看起来也不会像使用过的那样。

我到处都在寻找解决方法,但似乎找不到它,对此有什么帮助吗?

我在下面添加了我的代码:

  @IBOutlet weak var selectButton = UIButton(type: .custom)

  var bluBtnIphn : String = "blue_iPhone_btn.png"
  var orgBtnIphn : String = "org_iPhone_btn.png"

  switch UIDevice.current.userInterfaceIdiom {
  case .phone:
      print(tag,"iPhone Used")
      selectButton?.setImage(UIImage(named: bluBtnIphn), for: .normal)
      selectButton?.setImage(UIImage(named: orgBtnIphn), for: .highlighted)
  case .pad:
      print(tag,"iPad Used")
      selectButton?.setImage(UIImage(named: bluBtnIpad), for: .normal)
      selectButton?.setImage(UIImage(named: orgBtnIpad), for: .highlighted)
  case .unspecified:
      print("Unknown device..")
  default:
      break
  }

3 个答案:

答案 0 :(得分:4)

当不再有strong个引用时,对象将被释放。

在您的情况下,您的视图控制器仅具有weak对按钮的引用。

并且因为您正在代码中实例化它。那是唯一的引用。

之所以感到困惑,是因为您与在笔尖/故事板上创建的按钮和在代码中创建的按钮混为一谈。

当您从笔尖或情节提要中创建按钮时,它看起来像这样...

@IBOutlet weak var someButton: UIButton!
  • @IBOutlet告诉Xcode这是一个Interface Builder连接的对象
  • weak var在视图控制器中很弱,因为情节提要将其添加到视图中,然后视图获得了对其的强大引用。

在您的情况下,情节提要不是在创建它,因此请将其更改为...。

var selectButton = UIButton(type: .custom)

这将成为强大的参考,并阻止其取消分配。

编辑:在您发表最新评论后...

如果通过Interface Builder进行操作,则不要在代码中创建按钮。

如果您在Interface Builder中进行操作,则您的代码应为...

@IBOutlet weak var someButton: UIButton!

答案 1 :(得分:2)

1-您正在创建按钮的出口,因为它总是引用类型较弱,因为使用该按钮时,您需要检查它是否为零。您无法创建像@IBOutlet一样的弱var selectButton = UIButton(type:.custom)。

2-当您直接将图像设置为按钮时,键入name会通过自动智能显示图像,而无需像UIImage那样设置图像(名称为bluBtnIphn),因为您正在创建变量并浪费了内存。

3-将图像设置为按钮写入功能,并从viewDidLoad()或viewWillAppear()调用。

@IBOutlet weak var selectButton: UIButton!

    override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       setImageToButton()
    }

    func setImageToButton() {
      switch UIDevice.current.userInterfaceIdiom {
      case .phone:
          print(tag,"iPhone Used")
          selectButton?.setImage(bluBtnIphn, for: .normal)
          selectButton?.setImage(orgBtnIphn, for: .highlighted)
      case .pad:
          print(tag,"iPad Used")
          selectButton?.setImage(bluBtnIpad, for: .normal)
          selectButton?.setImage(orgBtnIpad, for: .highlighted)
      case .unspecified:
          print("Unknown device..")
      default:
          break
      }
}

答案 2 :(得分:1)

为什么使用@IBOutlet?您正在手动分配按钮,然后说明为什么使用@IBOutlet。

@IBOutlet weak var selectButton = UIButton(type: .custom) // this is wrong

上述用法将发出警告,因为没有对已分配按钮对象的强烈引用,因此在ARC中,它将在分配后取消分配,因此selectButton将为nil。

使用以下方式进行手动按钮分配

var selectButton = UIButton(type: .custom)