Objective-C

目次

概要

  • iPhone開発の仕方

参考

開発環境設定

  • キーチェーンアクセスを起動->証明書アシスタント->証明書を認証局に要求
  • ios provisioning portalから証明書を要求(iOS Developを選択)
  • ダウンロードした証明書をダブルクリックして、キーチェーンに追加する
    • ここで得られた証明書はどこかネット上で管理しておくと楽。
  • そうすると繋げば開発ができるようになる。

エリア

ナビゲータエリア

プロジェクトナビゲータファイルごとに参照
シンボルナビゲータC: Class, M: Methodなどで参照
検索ナビゲータプロジェクト全体から検索可能
問題ナビゲータエラー・警告

注意点

  • ObjectiveC++は面白くない。
    • 型に対する扱いの難易度が上がる。STLなど使えて便利。でもリテインカウントが雑魚かったり、基本良くない。
    • Objective Cは、new(に相当するもの)の引数によって、オブジェクトの型が変わるなどが起きる。インターフェースが同じなら大体同じ。

文法

インスタンスメソッドとクラスメソッド

  • "-"をつけるとインスタンスメソッドとなり、インスタンス化しないと利用できない。
  • "+"をつけるとクラスメソッドとなり、インスタンス化しなくても使える

Obj-Cのパブリック

  • .hファイルに書かれたinterfaceがpublicになり、.mファイルに書かれたinterfaceがprivateになる。
    • .mファイルのimplementationの中に書かれていてかつ.hには書かれていないメソッドもprivateになる。
@interface Person ()
@end

C言語との対比

CObj-C
親クラスがなくてよい親クラスを省略して記述できない
includeimport(ヘッダブロック不要!)
ryo->nameryo.name(アクセサを介す場合)
引数にラベルをつけられない引数にラベルをつけて、なんの引数に対するデータなのかがわかる
printf("test");NSLog(@"test");
stringNSString*
sprintf[NSString stringWithFormat:@"%@ 様", _name]
%s%@
thisself
なしsuper(親クラスの変数にアクセス)

クラス

アクセサ以外の実装

    • person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    // 名前
    NSString *_name;
}
  • (NSString *)name;
- (void)setName:(NSString *)name;
@end
  • person.m
#import "Person.h"
@implementation Person
  • (NSString *)name
{
    return _name;
}
  • (void)setName:(NSString *)name
{
    _name = name;
}
@end
  • 使うとき
Person *ryo = [[Person alloc] init];
[ryo setName:@"Hamko"];
NSLog(@"名前は%@です", [ryo name]);

ゲッタ・セッタの実装

  • propertyを使う。
    • 内部変数は_nameなど、_が前につくものとなる。
    • 外部からアクセサ(ゲッタ・セッタ)を明示的に使う場合は、getName, setNameなど、get, setが前につく上に変数の頭が大文字となる。
    • person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic) NSString *name; // 内部変数は_name
@property (nonatomic) NSInteger age; // 内部変数は_age
@end
  • person.m
#import "Person.h"
@implementation Person
  • (NSInteger)age // propertyの変数を直接関数名として、アクセサを上書き可能
{
    return _age*2; // 内部変数は_age
}
@end
  • 使うとき
Person *ryo = [[Person alloc] init];
ryo.name =  @"Hamko"; // [ryo setName:@"Hamko"];
NSLog(@"名前は%@です", ryo.name);

よく見る構文

[super viewDidLoad];親クラスで定義されているviewDidLoadメソッドを実行して
符号付整数NSInteger, int
符号無整数NSUInteger, uint
浮動小数点型の数値float, double
真理値BOOL, bool, Boolean

最終更新: 2020-01-01