声明固定大小的NSData()对象

时间:2016-08-29 11:32:15

标签: ios swift

我想创建固定大小的NSData对象,以提高性能。

var data = NSData(bytes: [], length: 18)

在Swift playground中我看到了结果

<a074740f 01000000 00bf740f 01000000 babc>

这是对的吗?难道他们都不是0吗?

另外,当我确定它的长度是那么长时,以固定大小实例化NSData对象是一个好习惯吗?

值得一提的是,我需要&#34;清空&#34;每次使用它之后,我都会读到这个对象的最佳方法就是分配一个新对象

self.data = NSData()

如果我在这里使用固定长度的第一段代码怎么办?我将获得这些随机值,而不是固定大小的空NSData

编辑:

提供有关我实际尝试实现的更多详情:

我从BLE读取数据,为了同步它们我使用计时器从当前值读取形式变量并在之后清除该变量值。

首先,我想声明固定大小的NSData变量,因为我认为它会磨练整个性能

其次,我想在使用后清除变量值

这是我在String上看它们在控制台中打印的方式,默认情况下我希望将值存储为NSData并传递给另一个类

class DataSynchronizer
{
var timer:NSTimer
var tag1:NSData = NSData()
var tag2:NSData = NSData()
var gpsData:CLLocation?
var timeInterval:Double


init(frequency:Double)
{
    self.timer = NSTimer()
    self.timeInterval =  1 / frequency

}

func scheduledTimerWithTimeInterval(){
    // Scheduling timer to Call the function **Countdown** with the interval of 1 seconds
    self.timer = NSTimer.scheduledTimerWithTimeInterval(self.timeInterval, target: self, selector: #selector(DataSynchronizer.syncValues), userInfo: nil, repeats: true)
}

func stopTimer()
{
    self.timer.invalidate()
}


@objc func syncValues()
{
    print(self.tag1)
    self.tag1 = NSData()
    print(self.tag2)
    self.tag2 = NSData()
    print("\n")
}
}

tag1和tag2值是从另一个处理BLE

的类修改的
    func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
    if self.updateStarted == false{
    self.updateStarted = true
    }

    let firstTagIdentifier = self.tagsIds[0]

    if "\(peripheral.identifier)" == firstTagIdentifier
    {

        self.peripheralCounter = self.peripheralCounter + 1

        let date = NSDate()
        if characteristic.value?.length == 18
        {

            synchronizer.tag1 = characteristic.value! //synchronizer is a DataSynchronizer instance
        }

1 个答案:

答案 0 :(得分:3)

var data = NSData(bytes: [], length: 18)

导致未定义的行为:它从空数组中读取18个字节。

let data = NSMutableData(capacity: 18)!

会创建一个(空)数据对象,其容量可容纳18个字节, 和

let data = NSMutableData()
data.length = 18

将创建一个具有18个零字节的数据对象。你可以清空 内容

data.length = 0

但是:随着

synchronizer.tag1 = characteristic.value!

synchronizer.tag1中存储的值被覆盖, 这意味着先前分配的数据对象被释放。 因此,如果您之前分配了固定大小的数据对象,则无关紧要。它也没有性能提升,因为你得到了 来自NSData的{​​{1}}对象。

如果要“清除”同步器类中的数据,请定义 标签作为可选变量:

characteristic.value

现在您可以通过再次分配var tag1: NSData? var tag2: NSData? 来分配数据并删除它:

nil