- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发应用程序“密码管理器”。在 RootVC(VC - View Controller )中,我有保存密码的表。单击行中的密码,我打开名为 EditPasswordVC 的第二个 VC,其中包含密码详细信息。密码存储在核心数据 (PasswordModel) 中。这行得通,但是当我打开密码时,我的内存力不断增加,看到密码返回后,再次打开相同或另一个密码,我的内存力不断增加。为什么?
根VC:
import UIKit
import CoreData
import SVProgressHUD
class ResponsiveView: UIView {
override var canBecomeFirstResponder: Bool {
return true
}
}
class RootVC: UITableViewController {
var passwordsArray = [PasswordModel]()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
@IBOutlet weak var addBarButton: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
loadPasswords()
SVProgressHUD.dismiss()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return passwordsArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RootCell", for: indexPath)
cell.textLabel?.text = passwordsArray[indexPath.row].title
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let editPasswordVC = EditPasswordVC()
editPasswordVC.passwordData = passwordsArray[indexPath.row]
self.navigationController?.pushViewController(editPasswordVC, animated: true)
}
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style: .normal, title: "Delete") { (action, sourceView, completionHandler) in
self.createConfirmDeletingAlertMessage(indexPath: indexPath)
}
delete.backgroundColor = .red
delete.image = UIImage(named: "delete-icon")
let swipeAction = UISwipeActionsConfiguration(actions: [delete])
swipeAction.performsFirstActionWithFullSwipe = false // This line disables full swipe
return swipeAction
}
private func loadPasswords() {
let request: NSFetchRequest<PasswordModel> = PasswordModel.fetchRequest()
do {
passwordsArray = try context.fetch(request)
} catch {
print("error load \(error)")
}
self.tableView.reloadData()
}
private func createConfirmDeletingAlertMessage(indexPath: IndexPath) {
let alertVC = UIAlertController(title: "Confirm deleting password!", message: "", preferredStyle: .alert)
let deleteAction = UIAlertAction(title: "DELETE", style: .default, handler: { (saveAction) in
self.deletePassword(indexPath: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
})
let cancelAction = UIAlertAction(title: "CANCEL", style: .default, handler: nil)
alertVC.addAction(deleteAction)
alertVC.addAction(cancelAction)
self.present(alertVC, animated: true, completion: nil)
}
private func deletePassword(indexPath: Int) {
self.context.delete(self.passwordsArray[indexPath])
self.passwordsArray.remove(at: indexPath)
do {
try self.context.save()
} catch {
print("error save in root vc \(error)")
}
}
}
这是 EditPasswordVC:
import Foundation
import Eureka
import GenericPasswordRow
import SVProgressHUD
protocol EditPasswordVCDelegate {
func editDidEnd()
}
class EditPasswordVC: FormViewController {
var passwordData: PasswordModel!
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil{
self.navigationController?.isToolbarHidden = false
}
}
override func viewDidLoad() {
super.viewDidLoad()
setupView()
initElements()
}
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
}
private func setupView() {
self.title = "Password detail"
self.navigationController?.isToolbarHidden = true
self.hideKeyboardWhenTappedAround()
navigationOptions = RowNavigationOptions.Disabled
createBarButtonItems()
}
private func createBarButtonItems() {
let editButton = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(editButtonPressed))
self.navigationItem.rightBarButtonItem = editButton
}
private func initElements() {
form +++ Section("Password information") {
$0.header?.height = { 40 }
}
<<< CustomTextCellRow() {
$0.tag = RowTags.rowTitleTag.rawValue
}.cellSetup({ (titleCell, titleRow) in
titleCell.setupTitleCell()
titleCell.setupNonEditCell()
titleCell.textFieldCustomTextCell.text = self.passwordData.title
})
<<< WebPageCellRow() {
$0.tag = RowTags.rowWebPageTag.rawValue
}.cellSetup({ (webPageCell, webPageRow) in
webPageCell.setupNonEditCell()
webPageCell.textFieldWebPage.text = self.passwordData.webPage
})
<<< CustomTextCellRow() {
$0.tag = RowTags.rowEmailTag.rawValue
}.cellSetup({ (emailCell, emailRow) in
emailCell.setupEmailCell()
emailCell.setupNonEditCell()
emailCell.textFieldCustomTextCell.text = self.passwordData.email
})
<<< CustomTextCellRow() {
$0.tag = RowTags.rowUsernameTag.rawValue
}.cellSetup({ (usernameCell, usernameRow) in
usernameCell.setupUsernameCell()
usernameCell.setupNonEditCell()
usernameCell.textFieldCustomTextCell.text = self.passwordData.username
})
+++ Section("Enter password") {
$0.header?.height = { 20 }
}
<<< GenericPasswordRow() {
$0.tag = RowTags.rowPasswordTag.rawValue
}.cellSetup({ (passwordCell, passwordRow) in
passwordCell.setupPasswordCell()
passwordCell.setupNonEditRow()
passwordCell.textField.text = self.passwordData.password
passwordCell.updatePasswordStrenghtAndTextFieldDidChange()
})
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let customTextCell = tableView.cellForRow(at: indexPath) as? CustomTextCell {
UIPasteboard.general.string = customTextCell.textFieldCustomTextCell.text
SVProgressHUD.showInfo(withStatus: "Copied To Clipboard")
SVProgressHUD.dismiss(withDelay: 1)
} else if let genericPasswordCell = tableView.cellForRow(at: indexPath) as? GenericPasswordCell {
UIPasteboard.general.string = genericPasswordCell.textField.text
SVProgressHUD.showInfo(withStatus: "Copied To Clipboard")
SVProgressHUD.dismiss(withDelay: 1)
} else {
let webPageCell = tableView.cellForRow(at: indexPath) as? WebPageCell
guard let url = URL(string: webPageCell!.textFieldWebPage.text ?? "https://") else { return }
UIApplication.shared.open(url)
}
tableView.deselectRow(at: indexPath, animated: false)
}
}
这是 link到我的仪器跟踪。我做错了什么?
谢谢
最佳答案
使用参数处理程序更改 UIContextualAction 声明将解决内存问题。以下是所需的修改。
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style: .normal, title: "Delete", handler: { (action, sourceView, completionHandler) in
self.createConfirmDeletingAlertMessage(indexPath: indexPath)
})
delete.backgroundColor = .red
delete.image = UIImage(named: "delete-icon")
let swipeAction = UISwipeActionsConfiguration(actions: [delete])
swipeAction.performsFirstActionWithFullSwipe = false // This line disables full swipe
return swipeAction
}
关于ios - 使用 Eureka 表单的内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53804253/
我有三台计算机,并且开发了Eureka feign和eureka客户服务应用程序,并将它们发布在docker中。上面的配置: 1.我在不同的Docker容器中发布了Eureka和feign,但它们位于
我正在通过阅读 this article 学习 Spring Cloud Netflix ,但是我开始对本文中的不同术语感到困惑,它们是: Eureka 服务。 据我了解,它是在唯一 uri 上运行的
Eureka 服务器设置 pom.xml 1.8 Hoxton.SR1 org.springframework.cloud spring
我正在实现服务发现并评估两个选项:Eureka 和 Consul。 帮我决定!我倾向于 Eureka,但我需要解决一个主要的技术问题。我的基础架构基于 openshift。我可以让多个容器在负载均衡器
他们是在 Eureka 中忽略区域或定义可接受区域列表的方法,例如,如果我们有 3 个区域(office、shahbour、joe ) 我希望区域 shahbour 中的服务仅使用 shahbour
我想在没有 Spring Boot 的情况下进行服务发现。 所以我下载了netflix项目example并且因为它的 gradle 项目我想使它成为 maven。 所以我创建了 maven 项目,导入
我想知道它是否存在让 Eureka 客户端知道它实际 instanceId 的方法(我正在寻找一种既适用于同一主机又适用于分布式 conf 的解决方案)。 到目前为止,我使用的是手动定义的 eurek
我对Docker和微服务有疑问。因此,我创建了ZuulService,EurekaServer + EurekaService,它在没有docker的情况下也可以正常工作。 但是我正在尝试研究dock
我正在研究用于服务发现的 Eureka,我发现如果我终止一个进程,Eureka 会将其显示为“DOWN”。有一天它会自己清理并移除它吗? 场景是这样的:假设我正在使用亚马逊 AWS。我想通过这种方式上
我正在创建一系列 ImageCheckRows 作为 SelectableSection,我想设置一些默认值。基本上每一行都返回一个真/假值,所以在某处应该有一个简单的方法来设置每一行的真或假。我尝试
如何创建一个表单,其中文本窗口可以在左侧添加一个按钮,类似于末尾附加的照片?这个想法是,通过输入textRow并单击按钮来显示我在数据库中搜索的信息,然后显示Eureka表单,按下搜索按钮后可以生成E
我有一台 Eureka 服务器。 server: port: 8761 eureka: client: registerWithEureka: false fetchRegis
我在 Spring Boot 应用程序中设置了 Eureka,并且 Eureka 内置了一个我喜欢的整洁的 Web UI 这是我在 application.yml 中的配置 server: por
我有一个 Eureka 服务器在端口 8761 (localhost:8761/eureka) 上运行,并且我有一个 Zuul 应用程序,我想向 eureka 注册,但我不断收到相同的错误: Can'
我一直在互联网上寻找有关将 spring-cloud-netflix eureka 服务器部署到 aws 的正确方法的指导。我们已经在使用 spring-cloud 和 nodejs 的微服务中使用了
我已经创建了 Eureka 服务注册表并将服务注册到其中。目前只有一个服务实例正在运行。如何添加同一服务的多个实例?我正在开发独立的应用程序。我正在通过 Rest 模板访问服务。我正在关注 https
我能够让 Eureka 服务器以对等模式运行。但我很好奇的一件事是如何让服务发现客户端注册到多个 eureka 服务器。 我的用例是这样的: 假设我有一个服务注册到其中一台 eureka 服务器(例如
在 Cloud config 中,我们存储了其他微服务可以访问的配置。在 Eureka 中,我们也存储配置信息。那么有什么区别以及何时使用什么? 最佳答案 了解更多之后,我明白 Eureka 不是用来
我有一个 Spring Boot 应用程序,它也是一个 Eureka 客户端。应用程序的正常行为是在 UP 启动时向 Eureka 服务器 注册。我有一个要求,即在部署期间完成冒烟测试之前,应用程序不
我是微服务新手(使用 Spring Boot)。复制生产代码并尝试在我的本地运行。我应该怎么做才能成功运行代码?有配置服务器、eureka 服务器、tomcat 服务器、zuul 路由工具、ribbo
我是一名优秀的程序员,十分优秀!