我已经编程Swift
了几个月了.最近,我更多地关注Swift
语言如何运作的概念.
因此,最近在阅读关于自动引用计数(ARC)的Apple文档时,我遇到了以下几行:
这一个在上面:
在大多数情况下,这意味着内存管理在Swift中"正常工作",您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实例使用的内存.
在下一段中,以下内容如下:
为了实现这一点,无论何时将类实例分配给属性,常量或变量,该属性,常量或变量都会对实例进行强引用.该引用被称为"强"引用,因为它保持对该实例的坚定持有,并且只要该强引用仍然存在就不允许它被释放.
我对这种情况的动态有点困惑.我在使用故事板时注意到,你设置了对弱的引用,因此类看起来像这样,我也称之为案例1:
情况1
class SomeClass : UIViewController {
@IBOutlet weak var nameLabel : UILabel!
override func viewDidLoad() {
nameLabel.text = "something."
}
}
Run Code Online (Sandbox Code Playgroud)
这里,标签与ViewController有一对一的弱引用,一旦Controller被更改,引用就会被破坏(内存dealloc),因为它很弱.因此,没有与内存有关的问题.
如果上述陈述错误或松散,请原谅我.如果有人确认我的假设或反击它,我会很高兴.
我的问题是关于第二种情况,我不使用故事板和类如下所示:
案例2
class SomeClass : UIViewController {
var nameLabel : UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
view.addSubView(nameLabel)
// view.addConstraints...
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的情况,我的假设是ViewController与标签有一对一的强引用,ViewController中的视图也有标签的强引用..如果类被更改/标签从子视图中删除..那么我认为记忆不会被解除分配.或者至少视图控制器将保持对标签的强引用(根据文档).
我通过从视图的子视图中删除标签并打印出标签来确认这一点(它给了我一个UILabel的实例,其框架为0原点和0大小.)因此一个实例不是零.
我唯一可以从中收集到的是,尽管标签已从UIView中删除,但它仍然保持与控制器的强引用,因此在内存中保持永久状态.我对吗?
如果是这样的话.我应该如何防止我的代码出现此类内存问题?更大的问题是,如果我像这样声明我的变量,我将它添加为nil,同时将其添加为控制器中主视图的子视图.
weak var nameLabel : UILabel = {
let …
Run Code Online (Sandbox Code Playgroud) 我在课堂上为我的方法添加了一些描述.这就是我实现这个目标的方法:
点击后看起来像这样......
如何使带下划线的方法可以点击?我希望它被引用,以便当用户点击它时,它们被定向到特定的网页以获取文档.
它甚至可能吗?在此先感谢,任何帮助将不胜感激
我可以用以下格式打印日期:2018年3月19日,星期一,但是我不确定如何以这种格式获取星期几。
请帮忙