Objective-C基礎教程ノート
4126 ワード
Objective-C基礎教程1-6章
最近は忙しくないし、深く研究していないので、慣例に従って接触したことのない新しいものを探して勉強して、WiEngine、Box 2 dの後、今度はObjective-Cの番です.Objectvie-Cはアップルの設備が風靡するにつれて、最も人気のある技術の一つでもある.
以下はObjective-Cベースチュートリアル1-6章を見た後、いくつかのものに対するメモは、完全なチュートリアルではなく、拾うようなもので、いくつかの異なる、よく知らないものをメモします(前のPythonノートと似ています)
すべてはHello Worldの恒古不変の法則に源を発して、1つの言語の構造を熟知して最も速くてこの万能のプログラムで、Objective-C拡張子は.m(後述.mmはC++スタイル)
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
NSLog(@"Hello Objective-C");
return (0);
}
ここでNSLogメソッドはObjective-C専属の一種であり,すべてのcocoaのオブジェクトにNS接頭辞が冠されて区別されている.入力パラメータ@""は、NSStringとして文字列が処理されていることを示し、プログラムの残りの部分はCと類似しており、#importの意味も言うまでもない
ブール値
Objective-Cのブール変数は多少異なり,パラメータタイプはBOOL,値はYES/NOであり,そのうちYESは1,NOは0で8ビットを占める
注意が必要なのは、int,shortのような値をBOOLに割り当てると、下位バイトだけが機能するので、これは特に注意しなければならない.これは、従来考えられていたゼロではなくtrueであることを意味しているからだ.
Objective-Cには「オブジェクト操作」という特有の構文があります.これは後でずっと見られます.
Objective-CにおけるOOPについて
@interface
少なくとも現在はjavaのインタフェースに類比していますが、名前も同じですが、Objective-Cのinterfaceはインタフェースとは異なり、インタフェースのObjective-Cのようなプロトコルというものがあります.
@interface Circle:NSObject
{
ShapeColor color;
ShapeRect bounds;
}
-(void) setFillColor: (ShapeColor) color;
-(void) setBounds: (ShapeRect) bounds;
-(void) draw;
@end
以上が標準的な@interface定義であり、Circleには2つの変数color,boundsが含まれており、3つの方法があることはよく理解できるはずです.
特別注意方法の説明方法
(void)戻りタイプを表すメソッド名およびパラメータ
drawメソッドにはパラメータも含まれていません.
複数のパラメータに対するメソッドの説明
-(void) setTire: (Tire *) tire atIndex:(int) index;(ここで2番目のパラメータは少し変に見えますが、後でメソッドを呼び出す過程でatIndexが使用されます)
Objective-Cのメソッド呼び出しは、接尾辞と呼ばれるものを使用します.
無参、1参、多参をそれぞれ呼び出す文法を見てみましょう.
[circle draw];
[circle setFillColor:kRedColor];
[car setTire:tire atIndex:2];
@implementation
名前と同じように、実現は@interfaceが申請した内容の具体的な実現である.
@implementation
-(void) setFillColor:(ShapeColor c)
{
color=c;
}
@end
ここのcolor=cはselfに相当する.color=c(ここではまたクラス比をしますが、現在の認識selfはjavaのthisポインタに相当します)
@interfaceと@implementationがあれば、クラス(オブジェクト)の定義が完了しても、オブジェクトをインスタンス化するにはどうすればいいのでしょうか.
id shapes[3];
shapes[0]=[Circle new];
[shpaes[0] setBounds:rect];
...
ここでまた新しいものidが見えてきました.それはあるオブジェクトを指すポインタで、これまでこの使い方を見ただけで、あまり認識していませんでしたが、簡単にインデックスと理解されました.
その後newオブジェクトのメソッド[Circle new]が見られ,次にオブジェクトを呼び出すメソッドが具体的なパラメータを設定する.
継承
@interface Circle:Shape
簡単な方法で、Objective-Cは継承規則上java、C#に違いなく、多重継承は許されないが、インタフェース(またはプロトコルと呼ぶべき)がある以上、javaと同じように、同じ目的を達成するのは難しくない.同じように、サブクラスは親クラスの方法を呼び出すことができ、super、例えば[super setColor:c];
Ojbective-CのNull値はnilです
次に、Carがどのように自動的に構築されたかを見てみましょう.
@implementation Car
-(id) init
{
if(self=[super init]){
engine=[Engine new];
...
}
return (self);
}
この一節は理解できないが,本の注釈では,スーパークラスが必要な使い捨て初期化を完了できる場合に[super init]を呼び出す必要があることを指す.Initメソッドの戻り値idは、倍初期化されたオブジェクトを記述する.[super init]の結果をselfに付与することはObjective-Cの標準的な慣例である.
Objective-Cにはgetter/setterメソッドがありますが、ネーミングルールでは注意が必要です
-(Engine *)engine;
-(void) setEngine: (Engine *) engine;
setメソッドでは依然としてsetXXXの方式を採用しているが、getメソッドはgetXXXではなくXXXを直接採用し、混同しないようにする.
分割
一般に@interface部分を入れる.hファイル中
#import <Cocoa/Cocoa.h>
@interface Tire:NSObject
@end
他の部分を置くmで、.mにこのヘッダファイルを導入することを覚えています
#import "Tire.h"
import下<>はシステムヘッダファイル""はローカルヘッダファイルを表す
キーワード@classはコンパイラにここがクラスであることを伝え、ポインタで伝える必要がある.
@class Tire
@class Engine
...
Engine *engine
これは、ポインタで他のクラスを指す場合にのみ使用でき、コンパイラの負担を軽減し、スーパークラスの情報を理解する必要があるため、継承する場合には使用できません.