objective-cとc++の違い

2237 ワード

ocのコンパイル命令はclang-fobjc-arc-framework Foundation testである.m -o test
 
ocでは,1はYES,0はNOを表す.0以外の値がYESというわけではありません.これはBOOL類似が本質的にsigned charであるためです.
 
ブロックについてはocで関数に意味ブロックを内定することができる.ブロックの機能は関数に似ていますが、関数内で定義でき、関数内のメンバー変数に変更権限がありません.でも_block修飾の変数は変更できます
 
クラス定義セクションで宣言されたメンバー変数とメンバー関数は、クラスでのみ使用できます.非表示のメンバー変数と関数を定義するのと同じです.効果は、クラスインタフェースで@privateを定義する変数と同じです.(私有と理解できますか?ocには友元がありません)
 
カテゴリ.既存のクラスにメソッドを追加できます.カテゴリの宣言形式について:
//ClassName+CategoryName.h

@interface ClassName(CategoryName)

//method declarations

@end



//ClassName+CategoryName.m

@implementation ClassName(CategoryName)

//method declarations

@end

カテゴリのファイル名規則は、一般的にClassName+CategoryName.を使用します.h{m}形式.
継承に対して、カテゴリの利点は、システムに存在するクラスは、変更を経ずにカテゴリを通じて機能を拡張することができることです.一部の機能ブロックを独立させ、パッケージの目的を達成することもできる.カテゴリのメソッドはクラスのメソッドなので、クラスのプライベートインスタンス変数を自由に参照できます.
 
匿名のカテゴリは、拡張とも呼ばれ、両者の違いは次のとおりです.
①カテゴリにメソッドを追加するしかありません.
②はい、間違っていません.クラス拡張はメソッドを増やすだけでなく、インスタンス変数(または合成属性)を増やすこともできます.ただし、このインスタンス変数のデフォルトは@privateタイプです(サブクラスや他の場所ではなく、自分のクラスでのみ機能します).
③クラス拡張で宣言されたメソッドは実装されず、コンパイラはアラームを鳴らすが、カテゴリ内のメソッドが実装されていないとコンパイラに警告はない.これは、クラス拡張がコンパイルフェーズでクラスに追加され、カテゴリが実行時にクラスに追加されるためです.
④クラス拡張は、クラスのように独立した実装部分(@implementation部分)を持つことはできません.つまり、クラス拡張が宣言する方法は、対応するクラスの実装部分に依存して実現されなければなりません.
⑤定義は.mファイルにおけるクラス拡張方法はプライベートであり、定義は.hファイル(ヘッダファイル)におけるクラス拡張方法は共通である.クラス拡張は.mファイルにプライベートメソッドを宣言する非常に良い方法です.
 
契約と委任について:
正式プロトコルはインタフェース仕様(プロトコル内のメソッドが実装されていなくてもコンパイル時は警告にすぎない)に相当し、@requiredと@optionalの2つのタイプがあり、それぞれ実装必須(実装されていなくてもコンパイラは警告にすぎない)とオプション実装を示す.
 
非公式プロトコルとは,カテゴリを用いて実現されるものであり,NSObjectの1つのカテゴリであり,NSObjectのクラスを継承することで,そのカテゴリに要求される方法をプロトコルと同様に実現できる.