nullptr -> new -> delete in C++

ネタに困ったら、ポインタ話。

以前にポインタを習得するには、概念だけではなく、malloc -> free のような実用的なコードも重要、みたいな話はした。

じゃあ、C++ では?ってことで、nullptr -> new -> delete の簡単なサンプル。


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    char *test = nullptr;
    
    //test = new char[100];
    
    if(test == nullptr){
        NSLog(@"test is nullptr");
    }else{
        NSLog(@"test is not nullptr");
    }
    
    delete test;
 
    return 0;
}

このままだと test is nullptr が、コメントアウトを外せば test is not nullptr が表示されます。

しかし、C に比べるとぐっと取り扱いが簡単になったね。

 

Objective-C と Java

Objective-C と Java にまつわる戯言。

リアルでは、Web 系にも手を出しているワイだが、このブログでは、どういうわけか上の二つの言語、というか環境に関する記事が多い。

理由は色々とある。

まず、個人的に、現在では主流ではないが「まだまだ使える」といったブツに弱いという癖があるので、それが出たかなあとは思う。

まあ、気合いの入った記事が少ないので、書けば、検索で上位にきやすいという現実的な理由もある。

あとは、この手のマイナーな環境に注目した方がこの業界の実態書きやすいってのもある。

記事を書く上で、情報が乏しいので、リアル・ネットの勉強会などに顔を出した。出不精な方だが、その程度のことはやる。

まー、不愉快な目にはあったさ。

使えない古参のマウンティングはここでもまた

以前にもちらっと書いたのだが、使えない古参からのマウンティングはやはりあった。

なんだけど、「お前の名前、ググったけど、2つくらいしか記事なかったぞ」というのが実態で、この怒りをどこにぶちまけていいものやら。

また、言っている内容がひどい。誰でも言えるようなことばっかり。

(続く)

 

NSTimer

ここしばらく Objective-C & MacOS の話題が続いているが、深い理由はない。

意外に使えることがわかってきて、この環境が好きになってきたから。

今回は、NSTimer の話。

結論から書くと、簡単に試すことができる。

タイマー関係といえば、昔、Java でえらい目にあったことがある。
動作がむちゃくちゃ不安定

まあ、Java の実行環境を考えるとしょうがないでしょう。

サンプル

それはともかく、検証に使ったソースコードは github にあげてあるのでよろしく。


@implementation Timer

-(id)initWithTimer
{
   self = [super init];
  if(self){
     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0f
                                                       target:self
                                                     selector:@selector(doTask:)
                                                     userInfo:nil
                                                      repeats:YES];
     //[timer fire];
    }

     return self;
}

-(void)doTask:(NSTimer *)timer
{
   //[timer invalidate];
   NSLog(@"timer");
}

@end

コーディング自体は簡単。
上のように Timer クラスを作って、AppDelegate から呼び出すのみ。

これでタイマー処理ができてしまう。

実行すると所定の間隔で doTask メソッドを実行してくれます。

Objective-C/Xcode Tips

何度、検索かけても、忘れているようなこと。メモ。

NSSet -> NSArray 変換

NSSet *nss = [[NSSet alloc] initWithObjects:@"AA", @"BB", @"CC", @"DD", nil];
NSArray *nsa = [nss allObjects];

任意のインスタンス変数のクラス名を調べる

NSString *className = NSStringFromClass([hoge class]);
NSLog(@"ClassName is: %@", className);

#pragma mark の謎

簡単に言えば、ソースコードを Xcode で扱った際に見出しをつけられる。

 

 

NSOutlineView と item

多層構造のデータ表示の仕方がわからない、と言っていたが、試行錯誤の末、できた。

Person – Child – GChild という階層を持つデータがあったとき、適切に実装すると以下のように表示が可能だ。

ポイントは、 item をうまく使うこと。

具体的には

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
    if(item){
        if([item isKindOfClass:[Child class]] ){
            Child *c = item;
            return [c.gchildren count];
        }
        if([item isKindOfClass:[Person class]] ){
            NSLog(@"this item is Person");
            return [[item children] count];
        }
        return 0;
    }else{
        return [self.objects count];
    }
}

などとする。

直感的には item = 行(インスタンス1つ)という理解でいいと思う。
トップ階層(item が定義できない)は、self.objects count などとしているわけですね。

参考

・ここでの質疑応答

item という概念がわからないというある人の問題提起に対して林さんが

私の場合ですが、実データを入れるクラスとOutlineのアイテムを別々のクラスにして、アイテムの方のクラスのプロパティに実データのクラスのインスタンスを入れるように実装したことがあります。アウトラインに表示する時にものによってそれに対応するデータのクラスが異なっていたので、アウトラインビューのデータソースのアイテムは表示のためのものと割り切りました。

と応えている。

これは考えてみれば当たり前の話で、NSOutlineView からしてみれば、どんなデータが要素になるかわからない。
だから、そこら辺はコーダーの方で処理してくれよ、という話になる。

・YouTube の動画

動画は流れを掴むのにちょうどいい。

31:53 TableColumn の identifier の設定。
36:30 NSOutluneView と管理クラスの結び付け(datasource 経由

あたりは「百聞は一見にしかず」でしょう。

・OsiriX/Horos/HorliX における NSOutlineView

調査中。

・NSTreeView を使う

この記事で NSTreeView を使っていた。
手が空いたら試す。

・公式解説