在swift中使用strongSelf的正确方法是什么?

时间:2015-07-16 12:41:34

标签: swift closures automatic-ref-counting

在非平凡块中的Objective-C中,我注意到了weakSelf / strongSelf的用法。

在Swift中使用strongSelf的正确方法是什么? 类似的东西:

if let strongSelf = self {
  strongSelf.doSomething()
}

因此,对于每个包含self in closure的行,我应该添加strongSelf检查吗?

if let strongSelf = self {
  strongSelf.doSomething1()
}

if let strongSelf = self {
  strongSelf.doSomething2()
}

有没有办法让上述更优雅?

5 个答案:

答案 0 :(得分:25)

使用strongSelf可以检查self是否等于nil。当你有一个可能在将来某个时候被调用的闭包时,重要的是传递一个weak self实例,这样你就不会通过保持对已经去初始化的对象的引用来创建一个保留周期。 / p>

{[weak self] () -> void in 
      if let strongSelf = self {
         strongSelf.doSomething1()
      }
}

基本上你要说的是,如果self不再存在,那么不要对它进行引用,也不要对它执行操作。

答案 1 :(得分:6)

使用import time import httplib2 # Do OAuth2 stuff to create credentials object from oauth2client.file import Storage from oauth2client.client import flow_from_clientsecrets #from oauth2client.tools import tools import math import tools import getopt import sys import string import datetime storage = Storage("creds.dat") credentials = storage.get() if credentials is None or credentials.invalid: flags = tools.argparser.parse_args(args=[]) flow = flow_from_clientsecrets("client_secret.json", scope=["https://spreadsheets.google.com/feeds"]) credentials = tools.run_flow(flow, storage, flags) if credentials.access_token_expired: credentials.refresh(httplib2.Http()) # Use it within old gdata import gdata.spreadsheet.service import gdata.service client = gdata.spreadsheet.service.SpreadsheetsService( additional_headers={'Authorization' : 'Bearer %s' % credentials.access_token}) #public example spreadsheet_key = my_spreadsheet_key' entry = client.GetSpreadsheetsFeed(spreadsheet_key) print entry.title temp=20 pressure = 1000 humidity = 40 # # Prepare the dictionary to write dict = {} dict['datetime'] = time.strftime("%Y-%m-%d %H:%M:%S") dict['ctemp'] = str(temp) dict['pressure'] = str(pressure) dict['humidity'] = str(humidity) rangeName = 'E1:H1' #What should I write here? #print dict #entry = client.InsertRow(dict, spreadsheet_key, 'od6') #if isinstance(entry, gdata.spreadsheet.SpreadsheetsList): #print "Insert row succeeded." #else: # print "Insert row failed." 而不使用weak self

的另一种方法
strongSelf

答案 2 :(得分:3)

如果strongSelf不是零,则doSomethingN()的使用似乎只针对调用self方法。相反,使用可选方法调用作为首选方法:

self?.doSomethingN()

答案 3 :(得分:1)

如果您在闭包中使用self,它会自动用作强力。

如果您尝试避免保留周期,还可以使用weakunowned。它是通过在闭包参数之前传递[unowned self]或[weak self]来实现的。

答案 4 :(得分:1)

Swift 4.2

guard let self = self else { return }

参考:https://benscheirman.com/2018/09/capturing-self-with-swift-4-2/