[NSString stringWithFormat:@"%p", myVar]
নতুন সুইফট ভাষায় ওজেক্টিভ-সি থেকে, অনুকরণ করার উপায় কি আছে ?
উদাহরণ স্বরূপ:
let str = "A String"
println(" str value \(str) has address: ?")
[NSString stringWithFormat:@"%p", myVar]
নতুন সুইফট ভাষায় ওজেক্টিভ-সি থেকে, অনুকরণ করার উপায় কি আছে ?
উদাহরণ স্বরূপ:
let str = "A String"
println(" str value \(str) has address: ?")
উত্তর:
এটি এখন মান লাইব্রেরির অংশ: unsafeAddressOf
।
/// Return an UnsafePointer to the storage used for `object`. There's
/// not much you can do with this other than use it to identify the
/// object
সুইফ্ট 3 এর জন্য, ব্যবহার করুন withUnsafePointer
:
var str = "A String"
withUnsafePointer(to: &str) {
print(" str value \(str) has address: \($0)")
}
withUnsafePointer
ফলাফল cannot pass immutable value as inout argument
।
print(self.description)
প্রিন্টস <MyViewController: 0x101c1d580>
, আমরা এটি একটি রেফারেন্স হিসাবে ব্যবহার করি। var mutableSelf = self; withUnsafePointer(to: &mutableSelf) { print(String(format: "%p", $0)) }
প্রিন্ট 0x16fde4028
যা স্পষ্টভাবে আলাদা ঠিকানা। কেন কেউ ব্যাখ্যা করতে পারেন?
0x101c1d580
print(String(format: "%p", unsafeBitCast(self, to: Int.self)))
UnsafePointer
এটি একটি কাঠামো, সুতরাং যে ঠিকানাটি এটি নির্দেশ করছে তা মুদ্রণের জন্য আপনাকে (এবং স্ট্রাকটি নিজেই নয়) আপনাকে মুদ্রণ করতে হবে String(format: "%p", $0.pointee)
!
দ্রষ্টব্য: এটি রেফারেন্স ধরণের জন্য।
print(Unmanaged.passUnretained(someVar).toOpaque())
কিছু ভারের স্মৃতি ঠিকানা মুদ্রণ করে। (@ ইংকে ধন্যবাদ)
print(Unmanaged<AnyObject>.passUnretained(someVar as AnyObject).toOpaque())
কিছু ভারের স্মৃতি ঠিকানা মুদ্রণ করে।
print(Unmanaged<AnyObject>.passUnretained(someVar as AnyObject).toOpaque())
Unmanaged
এটা ভালো করা সম্ভব: print(Unmanaged<AnyObject>.fromOpaque(&myStruct).toOpaque())
।
Unmanaged.passUnretained(someVar).toOpaque()
(জেনেরিক নির্দিষ্টকরণের প্রয়োজন নেই)
debugDescription
এর শেষে যোগ করার পরামর্শ দিই ।
মনে রাখবেন এই উত্তরটি বেশ পুরানো ছিল। এটি বর্ণনা করে এমন অনেকগুলি পদ্ধতি আর কাজ করে না। বিশেষত .core
আর অ্যাক্সেস করা যাবে না।
তবে @ ড্র এর উত্তর সঠিক এবং সহজ:
এটি এখন স্ট্যান্ডার্ড লাইব্রেরির অংশ: অনিরাপদ অ্যাড্রেসঅফ।
সুতরাং আপনার প্রশ্নের উত্তর হ'ল:
println(" str value \(str) has address: \(unsafeAddressOf(str))")
এখানে আসল উত্তরটি সঠিক হিসাবে চিহ্নিত হয়েছিল (উত্তরসূরি / ভদ্রতার জন্য):
সুইফ্ট পয়েন্টারগুলিকে "আড়াল করে", তবে সেগুলি এখনও হুডের নীচে বিদ্যমান। (কারণ রানটাইমটির এটির প্রয়োজন হয়, এবং ওজেজসি এবং সি এর সাথে সামঞ্জস্যের কারণে)
তবে কয়েকটি জিনিস জানা থাকলেও প্রথমে কীভাবে একটি সুইফ্ট স্ট্রিংয়ের মেমরি ঠিকানা মুদ্রণ করবেন?
var aString : String = "THIS IS A STRING"
NSLog("%p", aString.core._baseAddress) // _baseAddress is a COpaquePointer
// example printed address 0x100006db0
এটি স্ট্রিংয়ের মেমরি ঠিকানা মুদ্রণ করে, আপনি যদি XCode -> ডিবাগ ওয়ার্কফ্লো -> মেমরি দেখুন এবং মুদ্রিত ঠিকানায় যান, আপনি স্ট্রিংয়ের কাঁচা ডেটা দেখতে পাবেন। যেহেতু এটি একটি স্ট্রিং আক্ষরিক, এটি বাইনারি সঞ্চয়ের অভ্যন্তরের একটি মেমরি ঠিকানা (স্ট্যাক বা হিপ নয়)।
তবে, যদি আপনি করেন
var aString : String = "THIS IS A STRING" + "This is another String"
NSLog("%p", aString.core._baseAddress)
// example printed address 0x103f30020
এটি স্ট্যাকের উপরে থাকবে, কারণ স্ট্রিংটি রানটাইম এ তৈরি করা হয়েছিল
দ্রষ্টব্য: .ore._baseAdress নথিবদ্ধ নয়, আমি এটি ভেরিয়েবল পরিদর্শকের সন্ধানে পেয়েছি এবং এটি ভবিষ্যতে লুকিয়ে থাকতে পারে
_baseAddress সব ধরণের উপলভ্য নয়, এখানে সিআইএনটি সহ আরও একটি উদাহরণ রয়েছে
var testNumber : CInt = 289
takesInt(&testNumber)
takesInt
এটির মতো সি হেল্পার ফাংশনটি কোথায়
void takesInt(int *intptr)
{
printf("%p", intptr);
}
সুইফ্ট প্রান্তে, এই ফাংশনটি takesInt(intptr: CMutablePointer<CInt>)
তাই একটি সিআইএনটিতে সিএমটেবলপয়েন্টার নিয়ে যায় এবং আপনি এটির সাথে & বর্ণের সাহায্যে এটি পেতে পারেন
ফাংশন মুদ্রণ করে 0x7fff5fbfed98
, এই মেমরি ঠিকানার একটিতে আপনি 289 পাবেন (হেক্সাডেসিমাল স্বরলিপিতে)। আপনি এর সামগ্রীটি এর সাথে পরিবর্তন করতে পারেন*intptr = 123456
এখন, আরও কিছু বিষয় জানতে হবে।
স্ট্রিং, দ্রুতগতিতে, একটি প্রাথমিক ধরণের, কোনও বস্তু নয়।
সিআইএনটি একটি সুইফট টাইপ যা সি ইন্ট টাইপ-এ ম্যাপ করা হয়।
আপনি যদি কোনও জিনিসের মেমরি ঠিকানা চান তবে আপনাকে আলাদা কিছু করতে হবে।
সুইফ্টের কয়েকটি পয়েন্টার প্রকার রয়েছে যা সি এর সাথে ইন্টারেক্ট করার সময় ব্যবহার করা যেতে পারে এবং আপনি সেগুলি সম্পর্কে এখানে পড়তে পারেন: সুইফট পয়েন্টার প্রকারগুলি
আরও জানুন, রূপান্তর কীভাবে রূপান্তর করতে হয় তা বুঝতে আপনি তাদের ঘোষণার অন্বেষণ (সেন্টিমিড + টাইপ ক্লিক করুন) সম্পর্কে আরও জানতে পারবেন অন্য পয়েন্টার এক প্রকার
var aString : NSString = "This is a string" // create an NSString
var anUnmanaged = Unmanaged<NSString>.passUnretained(aString) // take an unmanaged pointer
var opaque : COpaquePointer = anUnmanaged.toOpaque() // convert it to a COpaquePointer
var mut : CMutablePointer = &opaque // this is a CMutablePointer<COpaquePointer>
printptr(mut) // pass the pointer to an helper function written in C
printptr
এই বাস্তবায়ন সহ আমি তৈরি করা একটি সি সহায়ক সহায়ক ফাংশন
void printptr(void ** ptr)
{
printf("%p", *ptr);
}
আবার, মুদ্রিত ঠিকানার একটি উদাহরণ: 0x6000000530b0
এবং আপনি যদি মেমরি পরিদর্শকের মাধ্যমে যান তবে আপনি আপনার এনএসএস স্ট্রিং পাবেন
আপনি সুইফ্টের পয়েন্টারগুলির সাথে একটি জিনিস করতে পারেন (এটি এমনকি আউটআউট প্যারামিটারগুলি দিয়েও করা যেতে পারে)
func playWithPointer (stringa :AutoreleasingUnsafePointer<NSString>)
{
stringa.memory = "String Updated";
}
var testString : NSString = "test string"
println(testString)
playWithPointer(&testString)
println(testString)
বা, Objc / c এর সাথে আলাপচারিতা
// objc side
+ (void)writeString:(void **)var
{
NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"pippo %@", @"pluto"];
*var = (void *)CFBridgingRetain(aString); // Retain!
}
// swift side
var opaque = COpaquePointer.null() // create a new opaque pointer pointing to null
TestClass.writeString(&opaque)
var string = Unmanaged<NSString>.fromOpaque(opaque).takeRetainedValue()
println(string)
// this prints pippo pluto
func address<T: AnyObject>(o: T) -> Int {
return unsafeBitCast(o, Int.self)
}
class Test {}
var o = Test()
println(NSString(format: "%p", address(o))) // -> 0x7fd5c8700970
( সম্পাদনা করুন: সুইফট ১.২ এখন একটি অনুরূপ ফাংশন অন্তর্ভুক্ত)unsafeAddressOf
))
উদ্দেশ্য-সি এ হবে [NSString stringWithFormat:@"%p", o]
।
o
উদাহরণ হিসাবে একটি রেফারেন্স। সুতরাং যদি o
অন্য কোনও ভেরিয়েবলের জন্য বরাদ্দ করা হয় তবে এর জন্য দেওয়া o2
ঠিকানাটি o2
একই হবে।
এটি স্ট্রাইক (সহ String
) এবং আদিম ধরণের (যেমন Int
) ক্ষেত্রে প্রযোজ্য নয় , কারণ যারা সরাসরি স্ট্যাকের উপরে থাকে। তবে আমরা স্ট্যাকের অবস্থানটি পুনরুদ্ধার করতে পারি।
func address(o: UnsafePointer<Void>) -> Int {
return unsafeBitCast(o, Int.self)
}
println(NSString(format: "%p", address(&o))) // -> 0x10de02ce0
var s = "A String"
println(NSString(format: "%p", address(&s))) // -> 0x10de02ce8
var i = 55
println(NSString(format: "%p", address(&i))) // -> 0x10de02d00
উদ্দেশ্য সি ইন এই হবে [NSString stringWithFormat:@"%p", &o]
বা [NSString stringWithFormat:@"%p", &i]
।
s
কাঠামোযুক্ত সুতরাং যদি s
অন্য ভেরিয়েবলের জন্য বরাদ্দ করা হয় s2
, মানটি অনুলিপি করা হবে এবং এর জন্য প্রাপ্ত ঠিকানাটি s2
ভিন্ন হবে।
উদ্দেশ্য-সি এর মতো, এর সাথে দুটি পৃথক ঠিকানা যুক্ত রয়েছে o
। প্রথমটি হল বস্তুর অবস্থান, দ্বিতীয়টি হল বস্তুর রেফারেন্সের অবস্থান (বা পয়েন্টার)।
হ্যাঁ, এর অর্থ হ'ল 0x7fff5fbfe658 ঠিকানার সামগ্রীটি 0x6100000011d0 নম্বর হিসাবে ডিবাগারটি আমাদের বলতে পারেন:
(lldb) x/g 0x7fff5fbfe658
0x7fff5fbfe658: 0x00006100000011d0
সুতরাং, স্ট্রিংগুলি স্ট্রাক্ট হওয়া ব্যতীত, অভ্যন্তরীণভাবে এটি সমস্ত (jজেক্টিভ- সি) মতো একইভাবে কাজ করে।
(এক্সকোড 6.3 হিসাবে বর্তমান)
টি এল; ডিআর
struct MemoryAddress<T>: CustomStringConvertible {
let intValue: Int
var description: String {
let length = 2 + 2 * MemoryLayout<UnsafeRawPointer>.size
return String(format: "%0\(length)p", intValue)
}
// for structures
init(of structPointer: UnsafePointer<T>) {
intValue = Int(bitPattern: structPointer)
}
}
extension MemoryAddress where T: AnyObject {
// for classes
init(of classInstance: T) {
intValue = unsafeBitCast(classInstance, to: Int.self)
// or Int(bitPattern: Unmanaged<T>.passUnretained(classInstance).toOpaque())
}
}
/* Testing */
class MyClass { let foo = 42 }
var classInstance = MyClass()
let classInstanceAddress = MemoryAddress(of: classInstance) // and not &classInstance
print(String(format: "%018p", classInstanceAddress.intValue))
print(classInstanceAddress)
struct MyStruct { let foo = 1 } // using empty struct gives weird results (see comments)
var structInstance = MyStruct()
let structInstanceAddress = MemoryAddress(of: &structInstance)
print(String(format: "%018p", structInstanceAddress.intValue))
print(structInstanceAddress)
/* output
0x0000000101009b40
0x0000000101009b40
0x00000001005e3000
0x00000001005e3000
*/
( সংক্ষেপে )
সুইফটে আমরা মান ধরণের (স্ট্রাকচার) বা রেফারেন্স ধরণের (ক্লাস) সাথে হয়। যখন করছেন:
let n = 42 // Int is a structure, i.e. value type
কিছু ঠিকানা ম্যাসেজ X এ বরাদ্দ করা হয়েছে, এবং এই ঠিকানায় আমরা 42 মানটি পেয়ে যাব Do কাজটি &n
এক্সকে সম্বোধন করার জন্য একটি পয়েন্টার তৈরি করে, সুতরাং &n
যেখানে n
অবস্থিত তা আমাদের জানিয়ে দেয় ।
(lldb) frame variable -L n
0x00000001005e2e08: (Int) n = 42
(lldb) memory read -c 8 0x00000001005e2e08
0x1005e2e08: 2a 00 00 00 00 00 00 00 // 0x2a is 42
যখন করছেন:
class C { var foo = 42, bar = 84 }
var c = C()
মেমরি দুটি স্থানে বরাদ্দ করা হয়:
যেমনটি বলা হয়েছে, ক্লাসগুলি রেফারেন্সের ধরণসমূহ: সুতরাং মানটি c
ঠিকানা X এ অবস্থিত, যেখানে আমরা Y এর মান খুঁজে পাই And এবং Y + 16 ঠিকানায় আমরা খুঁজে পাব foo
এবং Y + 24 ঠিকানার ঠিকায় আমরা খুঁজে পাব bar
( + 0 এবং + 8 এ আমরা টাইপ ডেটা এবং রেফারেন্স গণনাগুলি পেয়ে যাব, আমি আপনাকে এ সম্পর্কে আরও কিছু বলতে পারি না ...)।
(lldb) frame variable c // gives us address Y
(testmem.C) c = 0x0000000101a08f90 (foo = 42, bar = 84)
(lldb) memory read 0x0000000101a08f90 // reading memory at address Y
0x101a08f90: e0 65 5b 00 01 00 00 00 02 00 00 00 00 00 00 00
0x101a08fa0: 2a 00 00 00 00 00 00 00 54 00 00 00 00 00 00 00
0x2a
42 (foo) এবং 0x54
84 (বার) হয়।
উভয় ক্ষেত্রেই, ব্যবহার করে &n
বা&c
আমাদের ঠিকানা এক্স মান ধরনের যে আমরা কি চাই, কিন্তু রেফারেন্স ধরনের জন্য নয় দেব।
যখন করছেন:
let referencePointer = UnsafeMutablePointer<C>(&c)
আমরা রেফারেন্সে একটি পয়েন্টার তৈরি করি, অর্থাত্ একটি পয়েন্টার যা এক্সকে সম্বোধন করে withUnsafePointer(&c) {}
। ব্যবহার করার সময় একই জিনিস ।
(lldb) frame variable referencePointer
(UnsafeMutablePointer<testmem.C>) referencePointer = 0x00000001005e2e00 // address X
(lldb) memory read -c 8 0x00000001005e2e00 // read memory at address X
0x1005e2e00: 20 ec 92 01 01 00 00 00 // contains address Y, consistent with result below:
(lldb) frame variable c
(testmem.C) c = 0x000000010192ec20 (foo = 42, bar = 84)
হুডের নীচে কী চলছে সে সম্পর্কে এখন আমাদের আরও ভাল ধারণা রয়েছে এবং এটি যে এখন আমরা X এর ঠিক ঠিকায় আমরা ওয়াই ঠিকানা খুঁজে পাব (যা আমরা চাই এটি) এটি পেতে আমরা নিম্নলিখিতটি করতে পারি:
let addressY = unsafeBitCast(c, to: Int.self)
যাচাই করা হচ্ছে:
(lldb) frame variable addressY -f hex
(Int) addressY = 0x0000000101b2fd20
(lldb) frame variable c
(testmem.C) c = 0x0000000101b2fd20 (foo = 42, bar = 84)
এটি করার অন্যান্য উপায় রয়েছে:
let addressY1 = Int(bitPattern: Unmanaged.passUnretained(c).toOpaque())
let addressY2 = withUnsafeMutableBytes(of: &c) { $0.load(as: Int.self) }
toOpaque()
আসলে কল unsafeBitCast(c, to: UnsafeMutableRawPointer.self)
।
আমি আশা করি এটি সাহায্য করেছে ... এটি আমার পক্ষে হয়েছে 😆
MemoryLocation
ঠিকানাটি 2 টি পৃথক ঠিকানা উত্পাদন করার জন্য 2 টি পৃথক উদাহরণের মাধ্যমে মুদ্রণের চেষ্টা করার সময় ।
===
আইডেন্টিটি অপারেটর একই পদার্থের নির্দেশ করে 2 টি বস্তু পরীক্ষা করতে ব্যবহৃত হয়।ObjectIdentifier
মেমরি ঠিকানা পেতে ব্যবহার করুনclass C {}
let c1 = C()
let c2 = c1
//Option 1:
print("c1 address: \(Unmanaged.passUnretained(c1).toOpaque())")
//Option 2:
let o1 = ObjectIdentifier(c1)
let o2 = ObjectIdentifier(c2)
print("o1 -> c1 = \(o1)")
print("o2 -> c2 = \(o2)")
if o1 == o2 {
print("c1 = c2")
} else {
print("c1 != c2")
}
//Output:
//c1 address: 0x000060c000005b10
//o1 -> c1 = ObjectIdentifier(0x000060c000005b10)
//o2 -> c2 = ObjectIdentifier(0x000060c000005b10)
//c1 = c2
কেবল এটি ব্যবহার করুন:
print(String(format: "%p", object))
MyClass?
" সিভিআরআর্গের সাথে সামঞ্জস্য না করে সে সম্পর্কে কোনও সংকলক অভিযোগ পান তবে আপনি এটি করতে পারেন extension Optional : CVarArg { }
। অন্যথায় এটি অন্যান্য উত্তরের সমস্ত "অনিরাপদ" উন্মাদনা ছাড়াই ঠিকানা মুদ্রণ করে বলে মনে হচ্ছে।
var _cVarArgEncoding: [Int]
উপর CVarArg
। কীভাবে এটি প্রয়োগ করা উচিত তা পরিষ্কার নয়।
আপনি যদি কেবল এটি ডিবাগারে দেখতে চান এবং এটির সাথে অন্য কিছু না করেন তবে Int
পয়েন্টারটি পাওয়ার দরকার নেই । স্মৃতিতে কোনও বস্তুর ঠিকানার স্ট্রিং প্রতিনিধিত্ব পেতে, এই জাতীয় কিছু ব্যবহার করুন:
public extension NSObject { // Extension syntax is cleaner for my use. If your needs stem outside NSObject, you may change the extension's target or place the logic in a global function
public var pointerString: String {
return String(format: "%p", self)
}
}
ব্যবহারের উদাহরণ:
print(self.pointerString, "Doing something...")
// Prints like: 0x7fd190d0f270 Doing something...
অতিরিক্ত হিসাবে, মনে রাখবেন যে আপনি কোনও description
বিষয়টিকে ওভাররাইড না করে কেবল মুদ্রণ করতে পারবেন এবং এটি এর বর্ণনাকারী ঠিকানাটি আরও বর্ণনামূলক (যদি অফ ক্রিপ্টিক) পাঠ্যের পাশাপাশি প্রদর্শন করবে।
print(self, "Doing something else...")
// Prints like: <MyModule.MyClass: 0x7fd190d0f270> Doing something else...
// Sometimes like: <_TtCC14__lldb_expr_668MyModule7MyClass: 0x7fd190d0f270> Doing something else...
extension String {
static func pointer(_ object: AnyObject?) -> String {
guard let object = object else { return "nil" }
let opaque: UnsafeMutableRawPointer = Unmanaged.passUnretained(object).toOpaque()
return String(describing: opaque)
}
}
print("FileManager.default: \(String.pointer(FileManager.default))")
// FileManager.default: 0x00007fff5c287698
print("nil: \(String.pointer(nil))")
// nil: nil
Unmanaged.passUnretained(myObject).toOpaque()
পরিবর্তে সঠিকভাবে কাজ করে।
AnyObject
প্যারামিটার লাগে । আমি Any
ইনপুট টাইপ হিসাবে পছন্দ করব ।
let array1 = [1,2,3]
let array2 = array1
array1.withUnsafeBufferPointer { (point) in
print(point) // UnsafeBufferPointer(start: 0x00006000004681e0, count: 3)
}
array2.withUnsafeBufferPointer { (point) in
print(point) // UnsafeBufferPointer(start: 0x00006000004681e0, count: 3)
}
self?.array
।
অন্যান্য উত্তরগুলি ঠিক আছে, যদিও আমি পূর্ণসংখ্যার হিসাবে পয়েন্টার ঠিকানা পাওয়ার কোনও উপায় খুঁজছিলাম:
let ptr = unsafeAddressOf(obj)
let nullPtr = UnsafePointer<Void>(bitPattern: 0)
/// This gets the address of pointer
let address = nullPtr.distanceTo(ptr) // This is Int
একটু ফলোআপ।
@ অঙ্কিত উত্তরটি কেবল শ্রেণির জন্য ব্যবহার করা যেতে পারে।
@ এনএসচামের উত্তরটি কেবল স্ট্রাক্ট ধরণের জন্যই হতে পারে।
তবে আপনি যদি মান পদ্ধতির উপাদান সহ কোনও অ্যারের ঠিকানা পেতে দ্বিতীয় পদ্ধতি ব্যবহার করেন। সুইফট পুরো অ্যারেটি অনুলিপি করবে কারণ সুইফ্ট অ্যারেতে অনুলিপি অনুলিপি হয় এবং সি / সি ++ এর উপর নিয়ন্ত্রণ সরিয়ে দেওয়ার পরে সুইফট এটি এইভাবে আচরণ করে তা নিশ্চিত করতে পারে না ( &
ঠিকানাটি ব্যবহার করে যা ট্রিগার হয় )। এবং পরিবর্তে আপনি যদি প্রথম পদ্ধতি ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে রূপান্তরিত Array
হবেNSArray
যা অবশ্যই আমরা চাই না।
সুতরাং আমি সবচেয়ে সহজ এবং একীভূত উপায় খুঁজে পেয়েছি lldb নির্দেশ ব্যবহার করে frame variable -L yourVariableName
।
অথবা আপনি তাদের উত্তরগুলি একত্রিত করতে পারেন:
func address(o: UnsafePointer<Void>) {
let addr = unsafeBitCast(o, Int.self)
print(NSString(format: "%p", addr))
}
func address<T: AnyObject>(o: T) -> String{
let addr = unsafeBitCast(o, Int.self)
return NSString(format: "%p", addr) as String
}
এটি সুইফট 3 এর জন্য।
@ চর্লিমনরোয়ের মতো আমি পূর্ণসংখ্যা হিসাবে ঠিকানাটি পেতে চাই। বিশেষত, আমি ডায়াগনস্টিক লগিং মডিউলটিতে একটি থ্রেড আইডি হিসাবে ব্যবহারের জন্য একটি থ্রেড অবজেক্টের ঠিকানা চেয়েছিলাম, যেখানে কোনও থ্রেডের নাম উপলব্ধ ছিল না।
চার্লি মনরো এর কোডের উপর ভিত্তি করে, আমি এখন পর্যন্ত যা নিয়ে এসেছি তা এখানে। তবে সাবধান, আমি সুইফটে খুব নতুন, এটি সঠিক নাও হতে পারে ...
// Convert the memory address of the current Thread object into an Int for use as a thread ID
let objPtr = Unmanaged.passUnretained(Thread.current).toOpaque()
let onePtr = UnsafeMutableRawPointer(bitPattern: 1)! // 1 used instead of 0 to avoid crash
let rawAddress : Int64 = onePtr.distance(to: objPtr) + 1 // This may include some high-order bits
let address = rawAddress % (256 * 1024 * 1024 * 1024) // Remove high-order bits
সর্বশেষ বিবৃতিটি আছে কারণ এটি ছাড়া আমি 0x60000007DB3F এর মতো ঠিকানা পাচ্ছিলাম। সর্বশেষ বিবৃতিতে মডুলো অপারেশন 0x7DB3F এ রূপান্তর করে।
সুইফট 3 এ আমার সমাধান
extension MyClass: CustomStringConvertible {
var description: String {
return "<\(type(of: self)): 0x\(String(unsafeBitCast(self, to: Int.self), radix: 16, uppercase: false))>"
}
}
এই কোডটি ডিফল্ট বর্ণনার মতো বিবরণ তৈরি করে
<MyClass: 0x610000223340>
এটি অবশ্যই সবচেয়ে দ্রুত বা নিরাপদ উপায় নয়। তবে এটি আমার পক্ষে কাজ করে। এটি কোনও এনসোবজেক্ট সাবক্লাসকে এই সম্পত্তিটি গ্রহণ করার অনুমতি দেবে।
public extension NSObject {
public var memoryAddress : String? {
let str = "\(self.self)".components(separatedBy: ": ")
guard str.count > 1 else { return nil }
return str[1].replacingOccurrences(of: ">", with: "")
}
}
//usage
let foo : String! = "hello"
Swift.print(foo.memoryAddress) // prints 0x100f12980
[NSString stringWithFormat:@"%p", myVar]
,myVar
একটি পয়েন্টার হতে হবে। আপনার সুইফট কোডে,str
কোনও পয়েন্টার নয়। সুতরাং তুলনা প্রযোজ্য নয়।