Swift: 弱引用數組

在 iOS 開發中,通常沒有內置的 "弱引用數組",但你可以使用一些方法來管理包含弱引用對象的數組。以下是一種常見的方法,你可以創建一個數組來存儲弱引用對象,并在需要時進行添加、刪除和訪問。

Swift 示例:

import Foundation

class WeakArray<T: AnyObject> {
    private var array: [Weak<T>] = []
    
    func append(_ object: T?) {
        if let object = object {
            array.append(Weak(object))
        }
    }
    
    func remove(_ object: T?) {
        if let object = object, let index = array.firstIndex(where: { $0.value === object }) {
            array.remove(at: index)
        }
    }
    
    //清除無效對象
    func compact() {
        array = array.filter { $0.value != nil }
    }
    
    func allObjects() -> [T] {
        return array.compactMap { $0.value }
    }
    
    var count:Int{
        array.count
    }
}

// 定義一個包裝弱引用的類
class Weak<T: AnyObject> {
    weak var value: T?
    
    init(_ value: T?) {
        self.value = value
    }
}

使用這個 WeakArray 類,你可以輕松地管理包含弱引用對象的數組。你可以使用 append 方法添加對象,使用 remove 方法移除對象,使用 compact 方法清除已釋放的對象,以及使用 allObjects 方法獲取當前數組中的所有有效對象。

使用示例:

var weakArray = WeakArray<NSObject>()
var object1: NSObject? = NSObject()
var object2: NSObject? = NSObject()

weakArray.append(object1)
weakArray.append(object2)

// object1 被釋放,并從 weakArray 中移除
object1 = nil 

let objects = weakArray.allObjects() // 獲取當前數組中的有效對象

print("weakArray count:\(weakArray.count)")
print("objects count:\(objects.count)")
print("objects: \(objects)")

這個方法允許你創建一個數組,其中的對象是弱引用,可以在對象不再被強引用時自動被移除。這對于處理需要動態添加和移除對象的情況非常有用,比如觀察者模式或管理視圖控制器中的子視圖控制器。

輸出結果:

weakArray count:2
objects count:1
objects: [<NSObject: 0x600002680070>]

注意:
在弱引用數組中需要手動處理為nil的元素,因為對應的元素不會直接被WeakArray刪除,只是它的元素對應被包裹的值為nil,被釋放掉而已。

請注意,這種方法需要你手動檢查和處理弱引用是否為 nil,因為數組本身并不會自動清理已釋放的對象。如果你需要更多自動化的解決方案,你可能需要考慮使用 OC/Swift 中的 NSPointerArray 或 NSHashTable 類型,它們可以用于存儲弱引用對象,并具有一些自動管理弱引用的功能。

關于OC

在 iOS 開發中,你可以使用 Objective-C 來創建弱引用數組。通常,你可以使用 NSPointerArrayNSHashTable 類型來存儲弱引用對象,類似于 Swift 的方式。以下是如何在 Objective-C 中創建和使用弱引用數組的示例:

  1. 使用 NSPointerArray

NSPointerArray 在 Objective-C 中同樣可用,它可以用于存儲弱引用對象的數組。以下是一個示例:

#import <Foundation/Foundation.h>

// 創建一個 NSPointerArray 來存儲弱引用對象
NSPointerArray *weakArray = [NSPointerArray weakObjectsPointerArray];

// 添加對象到數組
NSObject *object1 = [[NSObject alloc] init];
[weakArray addPointer:(__bridge void *)object1];

NSObject *object2 = [[NSObject alloc] init];
[weakArray addPointer:(__bridge void *)object2];

// 從數組中獲取對象
NSObject *retrievedObject = (__bridge NSObject *)[weakArray pointerAtIndex:0];
if (retrievedObject) {
    // 使用 retrievedObject,確保它不為 nil
    NSLog(@"%@", retrievedObject);
} else {
    NSLog(@"Object 1 has been deallocated");
}

// 在不再需要對象時,它們會自動被釋放,并且相應的弱引用會變為 nil
  1. 使用 NSHashTable

NSHashTable 在 Objective-C 中同樣可用,它允許你創建一個弱引用集合,類似于 Set,但可以包含弱引用對象。以下是一個示例:

#import <Foundation/Foundation.h>

// 創建一個 NSHashTable 來存儲弱引用對象
NSHashTable *weakSet = [NSHashTable weakObjectsHashTable];

// 添加對象到集合
NSObject *object1 = [[NSObject alloc] init];
[weakSet addObject:object1];

NSObject *object2 = [[NSObject alloc] init];
[weakSet addObject:object2];

// 檢查集合中是否包含對象
if ([weakSet containsObject:object1]) {
    NSLog(@"Object 1 is in the weakSet");
} else {
    NSLog(@"Object 1 has been deallocated");
}

// 在不再需要對象時,它們會自動被釋放,并且相應的弱引用會從集合中移除

這兩種方法都可以在 Objective-C 中用于管理弱引用對象的數組或集合。你可以根據具體需求選擇使用 NSPointerArrayNSHashTable

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容