Open7

Objective-Cを勉強してみる

手羽先手羽先

目的

  • ソースコードを良んで理解できるようになるのが目的
    • 実務でObjective-Cが必要になったので勉強する
  • 今の自分がどれほどの期間で新しい言語を覚えられるか挑戦してみる

手段

  • ネット
    • ドキュメント
    • 記事

書籍を持っていない&ドキュメントで勉強してみたいため。

今の実力

#import <Foundation/NSObject.h> //あまりCやってないので完全に理解してない
#import <Foundation/NSString.h>
#import <stdio.h>

@interface MyTestClass : NSObject { // NSObjectとは?
    NSString *myTestString;
}
- (void)setMyTestString :(NSString *)testString; // -(マイナス)記号がついてるのは何?()記号は戻り値?
- (void)printMyTestString;
@end //このendはinterface?
//これがクラス?
@implementation MyTestClass : NSObject //implementationって何?

//全体的に書き方がわからない
- (void)setMyTestString :(NSString *)testString { // (NSString *)ってなんだ?
    myTestString = testString;
}
- (void)printMyTestString {
    printf("myTestString is %s \n", [myTestString UTF8String]);
}
@end
int main(void) {
    id myTestClass; //id?
    myTestClass = [[MyTestClass alloc] init]; //[]の意味が分からない
    [myTestClass setMyTestString:@"aiueo"]; //同様に分からない
    [myTestClass printMyTestString];
    return 0;
}

https://atmarkit.itmedia.co.jp/ait/articles/0809/09/news142.html のコードを参照

手羽先手羽先

https://atmarkit.itmedia.co.jp/fcoding/index/objc.html
丁寧そうなので、これからやってみる

手羽先手羽先
  • id
    • どのクラスのオブジェクトでも対応する型
  • []
    • メッセージ式
    • object.method()ではなく、メッセージのやり取りで動きを実装
      • smalltalkから来ている
手羽先手羽先
  • hとmに分かれている

    • h→ヘッダファイル

      • 宣言
    • m→実装ファイル

      • 実装
  • ソースファイル→コンパイル

    • バイナリ→リンク
      • 実行ファイル
手羽先手羽先

ポインタが分からない

何気にポインタを忘れかけていたり、普段使っているわけでもなかったので勉強した。苦しんで覚えるCがとても良かった。
https://9cguide.appspot.com/15-01.html

objective-cではインスタンス宣言したものをポインタ変数に入れるが、その理由はそのオブジェクトを直接操作したいからということがよく分かった。

- (void)printString:(NSString *)aString {
    NSLog(@"%@", aString);
}

NSString *helloString = [[NSString alloc] initWithString:@"Hello, World!"];
[self printString:helloString];

的に書くので、Go味を感じられた。

手羽先手羽先

世界一わかりやすいポインタ

#include <stdio.h>

int main(void)
{
    int *p;
    int i;
    p = &i;
    *p = 10; /* 通常変数モードに切り替えたポインタ変数に代入 */
    printf("*p = %d\n", *p);
    printf("i = %d\n", i);
    return 0;
}

ポインタ変数

int *p

int型のポインタ。アドレスが入る。
ポインタ変数のバイトサイズは変わらない(メモリ4GBのコンピュータであれば、0 ~ 42億)が、型によって使うメモリのサイズは違うので、その違い。int型のポインタをインクリメントすればアドレスは4つずれる。

int *p;
int i;
p = &i;
*p = 10;

ポインタ変数に間接参照演算子(*)をつけると、普通の変数と同じように(代入処理など)使える。

アドレス

p = &i;

&をつけることでその変数のアドレスを取得できる