↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > メモリの動きとポインタ

メモリの動きとポインタ

Swiftとポインターはあまり縁がないのかなと思っていたのですが、開発を進めていると 時々このUnsafePointerの名前を見ることがあります。本日はこのPointerが何を表しているかを調査してみます。

参考:SwiftでUnsafePointerなどのポインタを扱う
参考:Swift - UnsafePointerと上手に付き合う
参考:SwiftコードとC関数との間でのデータ変換について
参考:Swiftでポインタが指している値にアクセス

やってみた

資料をみているとUnsafePointerやCOpaquePointerはC言語等との連携時に必要(?)なようです。メモリ管理が必須なC言語なので、 Swiftで利用した場合Swift側でC言語と同じようにメモリを扱わないといけない、そういう流れなのかと理解しています。

さて、Pointerですが、 クラスのポインタを別クラスで保存して、その又別クラスで読み込むような場合はどうしたらよいかと調べていたのですがCMutableVoidPointerえるのかな?少し調査してみます。


let test = "swift-salaryman";
var p = &test;

こんな感じに&をつければよいのかな、と思ったけどエラー。

サンプル画像

よくわからなくなってきました、普通に変数にいれると元のクラスのメモリをそのまま渡すのでしょうか。基本のところですよね、、、


import UIKit

class ViewController: UIViewController {
    
    var test1:UIViewController = UIViewController();
    var test2:UIViewController = UIViewController();
    var test3:UIViewController = UIViewController();
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        test1 = self;
        test2 = self;
        test3 = self;
        println(test1);
        println(test2);
        println(test3);
    }    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

こんな感じにtest1,2,3の変数にselfを直接いれてそれぞれのメモリ参照のアドレスを比較してみました。

サンプル画像

メモリの場所は違うのかなぁ〜とか思っていましたが、一緒なんですね。特にポインタを意識しなくても参照を渡している、無意識に利用していましたがあらためて確認すると納得できました。

まとめ

タイトルのUnsafePointerを調べる予定が方向が変わってしまいましたが、改めてメモリの動きを少し感じました。 C言語開発のプログラマーの方からは批判されるかと思うのですが、VBからプログラムを始めた私はずっとメモリからは目を 背けていましたので、SwiftはそんなVB開発者でも簡単に利用できてしまうとっかかり易い言語であると同時に、 C言語との連携もあるので、一歩進んだSwift開発者になるにはメモリやポインタも改めて勉強しないといけないなぁ、 と思った記事になりました。未熟な内容失礼しました。。。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!