diff --git a/Foundation/NSKeyedArchiver.swift b/Foundation/NSKeyedArchiver.swift index 45a8028273..a5c43fd294 100644 --- a/Foundation/NSKeyedArchiver.swift +++ b/Foundation/NSKeyedArchiver.swift @@ -159,13 +159,13 @@ open class NSKeyedArchiver : NSCoder { return false } + defer { CFWriteStreamClose(writeStream) } + let keyedArchiver = NSKeyedArchiver(output: writeStream) keyedArchiver.encode(rootObject, forKey: NSKeyedArchiveRootObjectKey) keyedArchiver.finishEncoding() finishedEncoding = keyedArchiver._flags.contains(ArchiverFlags.finishedEncoding) - - CFWriteStreamClose(writeStream) return finishedEncoding } diff --git a/Foundation/NSKeyedUnarchiver.swift b/Foundation/NSKeyedUnarchiver.swift index bc97d238e9..2df365f120 100644 --- a/Foundation/NSKeyedUnarchiver.swift +++ b/Foundation/NSKeyedUnarchiver.swift @@ -74,6 +74,8 @@ open class NSKeyedUnarchiver : NSCoder { return nil } + defer { CFReadStreamClose(readStream) } + let keyedUnarchiver = NSKeyedUnarchiver(stream: Stream.stream(readStream)) do { try root = keyedUnarchiver.decodeTopLevelObject(forKey: NSKeyedArchiveRootObjectKey) @@ -81,8 +83,6 @@ open class NSKeyedUnarchiver : NSCoder { } catch { } - CFReadStreamClose(readStream) - return root } diff --git a/Foundation/NSXMLParser.swift b/Foundation/NSXMLParser.swift index 2825558660..58e5b14c34 100644 --- a/Foundation/NSXMLParser.swift +++ b/Foundation/NSXMLParser.swift @@ -559,9 +559,12 @@ open class XMLParser : NSObject { internal func parseFromStream() -> Bool { var result = true XMLParser.setCurrentParser(self) + defer { XMLParser.setCurrentParser(nil) } if let stream = _stream { stream.open() + defer { stream.close() } let buffer = malloc(_chunkSize)!.bindMemory(to: UInt8.self, capacity: _chunkSize) + defer { free(buffer) } var len = stream.read(buffer, maxLength: _chunkSize) if len != -1 { while len > 0 { @@ -572,10 +575,9 @@ open class XMLParser : NSObject { } else { result = false } - free(buffer) - stream.close() } else if let data = _data { let buffer = malloc(_chunkSize)!.bindMemory(to: UInt8.self, capacity: _chunkSize) + defer { free(buffer) } var range = NSMakeRange(0, min(_chunkSize, data.count)) while result { let chunk = data.withUnsafeBytes { (buffer: UnsafePointer) -> Data in @@ -588,11 +590,9 @@ open class XMLParser : NSObject { } range = NSMakeRange(range.location + range.length, min(_chunkSize, data.count - (range.location + range.length))) } - free(buffer) } else { result = false } - XMLParser.setCurrentParser(nil) return result }