在非平凡块中的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()
}
有没有办法让上述更优雅?
答案 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
,它会自动用作强力。
如果您尝试避免保留周期,还可以使用weak
或unowned
。它是通过在闭包参数之前传递[unowned self]或[weak self]来实现的。
答案 4 :(得分:1)
guard let self = self else { return }
参考:https://benscheirman.com/2018/09/capturing-self-with-swift-4-2/