可変メモリアドレスをすばやく印刷する



Printing Variable Memory Address Swift



解決:

注:これは参照型用です。

Swift 4/5:

print(Unmanaged.passUnretained(someVar).toOpaque())

someVarのメモリアドレスを出力します。 (@Yingに感謝)




Swift 3.1:

print(Unmanaged.passUnretained(someVar as AnyObject).toOpaque())

someVarのメモリアドレスを出力します。



スイフト2

これは現在、標準ライブラリの一部です。unsafeAddressOf。



/// UnsafePointerを `object`に使用されるストレージに返します。 ///オブジェクトを識別するために使用する以外に、これでできることはあまりありません///

スウィフト3

Swift 3の場合は、withUnsafePointer:

var str = '文字列' withUnsafePointer(to:&str){print( 'str value (str)has address:($ 0)')} 

この答えはかなり古いことに注意してください。それが説明する方法の多くはもはや機能しません。具体的には.coreにアクセスできなくなりました。

ただし、@ drewの答えは正しく単純です。



これは現在、標準ライブラリunsafeAddressOfの一部です。

したがって、あなたの質問に対する答えは次のとおりです。

println( 'str value (str)has address:(unsafeAddressOf(str))')

正解とマークされた元の回答は次のとおりです(後世/礼儀正しさのために):

Swiftは 'ポインタを'非表示にしますが、それらはまだ内部に存在します。 (ランタイムがそれを必要とし、ObjcおよびCとの互換性の理由から)

知っておくべきことはほとんどありませんが、最初にSwift文字列のメモリアドレスを出力する方法は?

var aString:String = 'これは文字列です' NSLog( '%p'、aString.core._baseAddress)// _ baseAddressはCOpaquePointerです//出力アドレスの例0x100006db0

これにより、文字列のメモリアドレスが出力されます。XCode-> Debug Workflow-> View Memoryを開き、出力されたアドレスに移動すると、文字列の生データが表示されます。これは文字列リテラルであるため、これはバイナリのストレージ内のメモリアドレスです(スタックやヒープではありません)。

ただし、そうする場合

var aString:String = 'これは文字列です' + 'これは別の文字列です' NSLog( '%p'、aString.core._baseAddress)//出力アドレスの例0x103f30020

文字列は実行時に作成されるため、これはスタックにあります

注:.core._baseAddressは文書化されていません。変数インスペクターで調べたところ、将来非表示になる可能性があります。

_baseAddressは、すべてのタイプで使用できるわけではありません。ここでは、CIntを使用した別の例です。

var testNumber:CInt = 289 TakesInt(&testNumber)

どこTakesIntはこのようなCヘルパー関数です

void TakesInt(int * intptr){printf( '%p'、intptr); }

Swift側では、この関数はTakesInt(intptr:CMutablePointer)なので、CMutablePointerをCIntに取得し、&varnameで取得できます。

関数は印刷します0x7fff5fbfed98、このメモリアドレスには289(16進表記)があります。あなたはその内容を変更することができます* intptr = 123456

さて、知っておくべき他のいくつかのこと。

文字列は、迅速に、オブジェクトではなくプリミティブ型です。
CIntは、Cint型にマップされたSwift型です。
オブジェクトのメモリアドレスが必要な場合は、別のことを行う必要があります。
Swiftには、Cと対話するときに使用できるいくつかのポインター型があり、ここでそれらについて読むことができます:Swiftポインター型
さらに、それらの宣言(cmd +型をクリック)を調べて、ポインターの型を別の型に変換する方法を理解することができます。

var aString:NSString = 'これは文字列です' // NSStringを作成しますvaranUnmanaged = Unmanaged.passUnretained(aString)//アンマネージポインターを取得しますvaropaque:COpaquePointer = anUnmanaged.toOpaque()// COpaquePointerに変換しますvarmut :CMutablePointer =&opaque //これはCMutablePointerですprintptr(mut)// Cで記述されたヘルパー関数へのポインターを渡します

printptrは、この実装で作成したCヘルパー関数です。

void printptr(void ** ptr){printf( '%p'、* ptr); }

繰り返しますが、印刷された住所の例は次のとおりです。0x6000000530b0、そしてメモリインスペクターを通過すると、NSStringが見つかります

Swiftのポインターでできることの1つ(これはinoutパラメーターでも実行できます)

func playWithPointer(stringa:AutoreleasingUnsafePointer){stringa.memory = '文字列が更新されました'; } var testString:NSString = 'テスト文字列' 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); // 保持! } //迅速な側面varopaque = COpaquePointer.null()// nullを指す新しい不透明なポインターを作成しますTestClass.writeString(&opaque)var string = Unmanaged.fromOpaque(opaque).takeRetainedValue()println(string)//これは出力しますピッポプルト