我想知道,如果数组(任何类型)的值被自动填充,当我用另一个替换它们时。例如,UIImage-Array的第一个值被另一个图像替换。第一个图像会发生什么,该数组之前包含该图像?是仅删除了引用还是从RAM中删除了图像本身?
感谢您的回答!
答案 0 :(得分:3)
只有在没有对它的引用时才会释放图像。
请查看Automatic Reference Counting了解详情。
答案 1 :(得分:0)
Swift使用自动参考计数(ARC)。你必须牢记swift中类和结构之间的区别。
来自Apple的文档:
引用计数仅适用于类的实例。结构和枚举是值类型,而不是引用类型,不会通过引用存储和传递。
简而言之,ARC会跟踪有多少常量,变量和属性引用(强引用)类的实例。如果没有引用,ARC将释放实例并释放内存。
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var steve: Person? = Person(name: "Steve") // Increasing ref counter -> 1
var sameSteve: Person? = steve // Increasing ref counter -> 2
steve = nil // Decreasing ref counter -> 1
print(sameSteve?.name) // prints "Steve"
sameSteve = nil // Decreasing ref counter -> 1
print(sameSteve?.name) // prints nil because it was deallocated
因此,由于UIImage
是引用类型,如果从数组中删除或替换,ARC将减少其引用计数器。如果没有其他变量,常量或属性保持它,则图像将被释放。
答案 2 :(得分:0)
ARC的概念在这里使用。 第一个图像也是一个UIImage实例,当您用第二个UIImage对象替换第一个UIImage对象时,将删除对第一个对象的强引用。 情况1 :(现在,我假设您没有在任何其他行中使用该第一个UIImage实例或分配给任何其他变量。) 因为,该对象没有任何强有力的参考。当您用第二个图像对象替换它时,ARC会自动将其从内存中删除。
案例2:但如果您已将其分配给下一个变量,那么它将不会被删除。 让我用例子向你展示:
案例1:
var images = [UIImage]()
images.append(UIImage(named: "elcapitan"))
//now this first image is stored in index number 0 of the array
//images[0] gives you access to this first image in this case
//now i will replace the first image
images[0] = UIImage(named: "yosemite")
在这种情况下,ARC会自动删除第一个图像实例,因为它不是从任何地方强引用的
案例2:
var images = [UIImage]()
var firstImage = UIImage(named: "elcapitan")
images.append(firstImage)
//now this first image is stored in index number 0 of the array
//images[0] gives you access to this first image in this case
//now i will replace the first image
images[0] = UIImage(named: "yosemite")
在这种情况下,ARC无法删除第一个图像实例,因为尽管已在数组中替换,但它仍然被变量firstImage强引用。只有在将下一个图像分配给firstImage变量后,才会删除该实例。即只有你这样做:firstImage = UIImage(名称:" Windows")
希望你得到答案:)