Swift Language
(असुरक्षित) बफर पॉइंटर्स
खोज…
परिचय
“एक बफर पॉइंटर का उपयोग मेमोरी के क्षेत्र में निम्न-स्तरीय पहुंच के लिए किया जाता है। उदाहरण के लिए, आप एप्लिकेशन और सेवाओं के बीच डेटा के प्रभावकारी प्रसंस्करण और संचार के लिए एक बफर पॉइंटर का उपयोग कर सकते हैं। ”
इसके अंश: Apple Inc. "कोको और ऑब्जेक्टिव-सी (स्विफ्ट 3.1 संस्करण) के साथ स्विफ्ट का उपयोग करना।" iBooks। https://itun.es/us/utTW7.l
आप लीक या अपरिभाषित व्यवहार से बचने के लिए बफर पॉइंटर्स के माध्यम से काम करने वाले किसी भी मेमोरी के जीवन चक्र को संभालने के लिए जिम्मेदार हैं।
टिप्पणियों
(Unsafe) बफ़रपॉइंटर्स की समझ को पूरा करने के लिए आवश्यक अवधारणाओं को बारीकी से संयोजित करना।
- MemoryLayout ( एक प्रकार का मेमोरी लेआउट, इसका आकार, स्ट्राइड और संरेखण वर्णन करता है ।)
- अप्रबंधित ( एक अप्रबंधित वस्तु संदर्भ के प्रचार के लिए एक प्रकार ।)
- UnsafeBufferPointer (स्मृति में संक्रामक रूप से संग्रहीत तत्वों की एक बफर के लिए एक गैर-मालिकाना संग्रह इंटरफ़ेस ।)
- UnsafeBufferPointerIterator ( बफर में तत्वों के लिए एक पुनरावृत्त एक UnsafeBufferPointer या UnsafeMutableBufferPointer उदाहरण द्वारा संदर्भित )।
- UnsafeMutableBufferPointer ( एक गैर-स्वामित्व वाला संग्रह इंटरफ़ेस जो स्मृति में संचित रूप से संग्रहीत किए जाने योग्य उत्परिवर्तित तत्वों के बफर के लिए है। )
- UnsafeMutablePointer ( किसी विशिष्ट प्रकार के डेटा तक पहुंचने और हेरफेर करने के लिए एक सूचक। )
- UnsafeMutableRawBufferPointer ( स्मृति के एक क्षेत्र में बाइट्स के लिए एक परस्पर नॉनवेज संग्रह इंटरफ़ेस ) ।
- UnsafeMutableRawBufferPointer.Iterator ( कच्चे बफ़र सूचक द्वारा देखे गए बाइट्स पर एक पुनरावृत्त । )
- UnsafeMutableRawPointer (अप्राप्त डेटा तक पहुंचने और हेरफेर करने के लिए एक कच्चा सूचक ) ।
- UnsafePointer ( किसी विशिष्ट प्रकार के डेटा तक पहुंचने के लिए एक सूचक। )
- UnsafeRawBufferPointer ( मेमोरी के एक क्षेत्र में बाइट्स के लिए एक गैर-संग्रह संग्रह इंटरफ़ेस ) ।
- UnsafeRawBufferPointer.Iterator ( कच्चे बफर सूचक द्वारा देखे गए बाइट्स पर एक पुनरावृत्त । )
- UnsafeRawPointer (अप्राप्त डेटा तक पहुँचने के लिए एक कच्चा सूचक )
(स्रोत, Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
किसी विशिष्ट प्रकार के डेटा तक पहुंचने और हेरफेर करने के लिए एक सूचक।
आप किसी विशिष्ट प्रकार के डेटा को मेमोरी में एक्सेस करने के लिए UnsafeMutablePointer प्रकार के इंस्टेंस का उपयोग करते हैं। जिस प्रकार का डेटा एक पॉइंटर एक्सेस कर सकता है वह पॉइंटर पॉइंटी टाइप है। UnsafeMutablePointer कोई स्वचालित मेमोरी प्रबंधन या संरेखण गारंटी प्रदान नहीं करता है। आप लीक या अपरिभाषित व्यवहार से बचने के लिए असुरक्षित पॉइंटर्स के माध्यम से काम करने वाले किसी भी मेमोरी के जीवन चक्र को संभालने के लिए जिम्मेदार हैं।
मेमोरी जिसे आप मैन्युअल रूप से प्रबंधित करते हैं, या तो अप्रकाशित हो सकती है या एक विशिष्ट प्रकार से बाध्य हो सकती है। आप स्मृति तक पहुँचने और प्रबंधित करने के लिए UnsafeMutablePointer प्रकार का उपयोग करते हैं जो एक विशिष्ट प्रकार से बँधा हुआ है। ( स्रोत )
import Foundation
let arr = [1,5,7,8]
let pointer = UnsafeMutablePointer<[Int]>.allocate(capacity: 4)
pointer.initialize(to: arr)
let x = pointer.pointee[3]
print(x)
pointer.deinitialize()
pointer.deallocate(capacity: 4)
class A {
var x: String?
convenience init (_ x: String) {
self.init()
self.x = x
}
func description() -> String {
return x ?? ""
}
}
let arr2 = [A("OK"), A("OK 2")]
let pointer2 = UnsafeMutablePointer<[A]>.allocate(capacity: 2)
pointer2.initialize(to: arr2)
pointer2.pointee
let y = pointer2.pointee[1]
print(y)
pointer2.deinitialize()
pointer2.deallocate(capacity: 2)
मूल स्रोत से स्विफ्ट 3.0 में परिवर्तित
बफ़र पॉइंटर्स के लिए व्यावहारिक उपयोग-मामला
स्विफ्ट लाइब्रेरी पद्धति में एक असुरक्षित पॉइंटर के उपयोग की घोषणा करना;
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
उद्देश्य:
दिए गए पॉइंटर द्वारा संदर्भित null-terminated UTF-8 डेटा की प्रतिलिपि बनाकर और सत्यापित करके एक नया स्ट्रिंग बनाता है।
यह इनिशलाइज़र बीमार-गठित UTF-8 कोड इकाई अनुक्रमों को ठीक करने का प्रयास नहीं करता है। यदि कोई पाया जाता है, तो इनिलाइज़र का परिणाम nil
। निम्नलिखित उदाहरण दो अलग-अलग CChar
सरणियों की सामग्री को संकेत के साथ इस CChar
हैं --- पहला अच्छी तरह से गठित UTF-8 कोड इकाई अनुक्रमों के साथ और दूसरा अंत में एक बीमार-निर्मित अनुक्रम के साथ।
स्रोत , Apple Inc., स्विफ्ट 3 हेडर फ़ाइल (हेडर एक्सेस के लिए: खेल के मैदान में, Cmd + कोड की लाइन में स्विफ्ट शब्द पर क्लिक करें):
import Swift
let validUTF8: [CChar] = [67, 97, 102, -61, -87, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "Optional(Café)"
let invalidUTF8: [CChar] = [67, 97, 102, -61, 0]
invalidUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "nil"
(स्रोत, Apple Inc., स्विफ्ट हैडर फ़ाइल उदाहरण)