ダークホースプログラマー——OCのARC、Block、Protocol
7128 ワード
-Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、コミュニケーションを期待!--
前にOCのメモリ管理についてお話ししましたが、煩雑で管理しにくいです.ARCはiOS 5以降に追加された新しい特性で、メモリを手動で管理する煩わしさを完全に解消し、コンパイラは適切な場所に適切なretain、release、autorelease文を自動的に挿入します.コンパイラがすべてを処理してくれたので、メモリ管理を心配する必要はありません.ARCはiOSランタイムプロパティではなく、コンパイラプロパティであり、他の言語のゴミ収集器に似ていません.したがって、ARCは手動メモリ管理と同様に、コンパイラがいくつかの最適化を実行できるため、より高速になる場合があります.判定基準ARCの判定基準:強いポインタが対象を指していない限り、対象は解放される. 特徴1、release、retain、retainCountの呼び出しは許可されていない.2、deallocの書き換えは許可されているが、[super dealloc]の呼び出しは許可されていない.3、@propertyのパラメータ strong:メンバー変数は強いポインタ(OCオブジェクトタイプに適用) weak:メンバー変数は弱いポインタ(OCオブジェクトタイプに適用) assign:非OCオブジェクトタイプ4、retainをstrongに変更します.
デフォルトでは、多くのポインタが強いポインタ_strong、弱いポインタの表示は_weak.
以前のメモリ管理では、ループリファレンスについて説明しました.
メモリ漏洩を解決するために、retainの1つをassignに変更すれば、この問題を解決できます.しかしARCではretainを使用しません.この場合、strongを使用し、weakを使用してもこの問題を解決することができます.
Blockはコードパッケージであり、コードをパッケージ化することができ、いつでも実行することができ、関数パラメータまたは関数の戻り値として使用することができ、それ自体に入力パラメータまたは戻り値を持つことができる.Blockのロゴは:^.関数に似ていて、コードを保存することができ、戻り値にパラメータがあり、呼び出し方法も同じです. block変数を定義block変数 を定義するには、次のようにします.
次のように書くこともできます.パッケージコード
ブロックにパラメータがない場合は、後ろのカッコを省略できます.上記のプログラムは以下に簡略化できます.アクセス変数
上記のプログラムではaは付与できません.デフォルトでは、block内部では外部のローカル変数を変更することはできませんが、NSLogは出力できます.block内部で外部の変数にアクセスできるので、ローカル変数に__を加えるとblockキーワード、このローカル変数はblock内部で修正できます. typedefを使用してblockタイプを定義します.定義を容易にするために、typedefを使用してblockタイプを定義します. と書くことができます.
そしてMyBlockというタイプを利用してblock変数を定義することができます.これは私たちのC言語で関数を指すポインタと似ています.
protocolは、クラスがこのプロトコルを遵守している限り、このプロトコルのすべてのメソッド宣言を所有することに相当し、親がこのプロトコルを遵守している限り、サブクラスも遵守することに相当する、多くのメソッド(メンバー変数を宣言できない)を宣言するために使用できます.プロトコルの定義
コードの中のNSObjectは、ベースプロトコルであり、最も根本的な最も基本的なプロトコルであり、NSObjectがベースクラスであり、最も根本的な最も基本的なクラスであるように、他のクラスは最終的にそれを継承しなければならない.NSObjectプロトコルには、description、retain、releaseなど、最も基本的な方法が多く宣言されており、各新しいプロトコルは明確な要求がない場合、NSObjectプロトコルを遵守しなければならない.契約書1、クラス契約書 の遵守方法
2、協議遵守協議プロトコルでメソッド宣言のキーワード1,@requiredは実装を要求し、実装されていない場合は警告が発行され、デフォルトでは新しい宣言のメソッドはこのタイプです.2,@optionalは実現を要求せず,警告もない.これらのキーワードは、プログラミングではほとんど使用されませんが、プログラマー間のコミュニケーションに便利です. 変数がプロトコルの遵守に対して1つの変数を定義する場合、私たちはこの変数が保存したオブジェクトがプロトコルを遵守することを制限することができ、2つの方法で実現することができます:クラス名*変数名;id変数名;
対応するプロトコルが守られていない場合、コンパイラは警告します.@propertyで宣言されたプロパティは、プロトコルを遵守する制限 としても使用できます.
面倒なことは自分でやりたくないので、誰かに手伝ってもらって、代理人に任せてもいいです.このモードの設計で注意しなければならない点はいくつかあります.第一に、エージェントはエージェントが必要とすること、すなわち方法を含むエージェントプロトコルを遵守しなければならない.これにより、新しいエージェントを交換すると同時に、メソッドを書き直す必要がなく、新しいエージェントがこのプロトコルを遵守するだけでよい.第二に、Personの声明では、クラス名の代わりにidを採用しています.idは万能ポインタに属しています.これにより、新しいエージェントを交換しながらクラス名を変更することを回避できます.次のようになります.
ここまでOCのすべての文法を学びましたが、知識は絶えず消化吸収する必要があります.私たちはただ一度理解しただけで、知識に対する理解を深めるためにもっと多くのコードが必要です.
-Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、コミュニケーションを期待!--
ARC
前にOCのメモリ管理についてお話ししましたが、煩雑で管理しにくいです.ARCはiOS 5以降に追加された新しい特性で、メモリを手動で管理する煩わしさを完全に解消し、コンパイラは適切な場所に適切なretain、release、autorelease文を自動的に挿入します.コンパイラがすべてを処理してくれたので、メモリ管理を心配する必要はありません.ARCはiOSランタイムプロパティではなく、コンパイラプロパティであり、他の言語のゴミ収集器に似ていません.したがって、ARCは手動メモリ管理と同様に、コンパイラがいくつかの最適化を実行できるため、より高速になる場合があります.
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
デフォルトでは、多くのポインタが強いポインタ_strong、弱いポインタの表示は_weak.
以前のメモリ管理では、ループリファレンスについて説明しました.
p.card = c;
c.person = p;
メモリ漏洩を解決するために、retainの1つをassignに変更すれば、この問題を解決できます.しかしARCではretainを使用しません.この場合、strongを使用し、weakを使用してもこの問題を解決することができます.
Block
Blockはコードパッケージであり、コードをパッケージ化することができ、いつでも実行することができ、関数パラメータまたは関数の戻り値として使用することができ、それ自体に入力パラメータまたは戻り値を持つことができる.Blockのロゴは:^.関数に似ていて、コードを保存することができ、戻り値にパラメータがあり、呼び出し方法も同じです.
int (^MyBlock)(int, int);
void (^MyBlock)();
次のように書くこともできます.
int (^MyBlock)(int, int) = ^(int a, int b){
return a + b;
};
^(int a, int b){
return a - b;
};
^(){
NSLog(@"_________");
};
ブロックにパラメータがない場合は、後ろのカッコを省略できます.上記のプログラムは以下に簡略化できます.
^{
NSLog(@"_________");
};
void test()
{
int a = 10;
__block int b = 20;
void (^block)();
block = ^{
NSLog(@"a = %d", a);
// a = 20;
b = 25;
};
block();
}
上記のプログラムではaは付与できません.デフォルトでは、block内部では外部のローカル変数を変更することはできませんが、NSLogは出力できます.block内部で外部の変数にアクセスできるので、ローカル変数に__を加えるとblockキーワード、このローカル変数はblock内部で修正できます.
typedef int (^MYBlock)(int , int);
そしてMyBlockというタイプを利用してblock変数を定義することができます.これは私たちのC言語で関数を指すポインタと似ています.
MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b){
return a - b;
};
MyBlock b3 = ^(int a, int b){
return a - b;
};
Protocol
protocolは、クラスがこのプロトコルを遵守している限り、このプロトコルのすべてのメソッド宣言を所有することに相当し、親がこのプロトコルを遵守している限り、サブクラスも遵守することに相当する、多くのメソッド(メンバー変数を宣言できない)を宣言するために使用できます.
@protocol <NSObject>
// ……
@end
コードの中のNSObjectは、ベースプロトコルであり、最も根本的な最も基本的なプロトコルであり、NSObjectがベースクラスであり、最も根本的な最も基本的なクラスであるように、他のクラスは最終的にそれを継承しなければならない.NSObjectプロトコルには、description、retain、releaseなど、最も基本的な方法が多く宣言されており、各新しいプロトコルは明確な要求がない場合、NSObjectプロトコルを遵守しなければならない.
@interface :
@end
2、協議遵守協議
@protocol
@end
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
対応するプロトコルが守られていない場合、コンパイラは警告します.
// @property (nonatomic, strong) * ;
@property (nonatomic, strong) Dog *dog;
// @property (nonatomic, strong) id ;
@property (nonatomic, strong) id dog;
エージェント設計モード
面倒なことは自分でやりたくないので、誰かに手伝ってもらって、代理人に任せてもいいです.このモードの設計で注意しなければならない点はいくつかあります.第一に、エージェントはエージェントが必要とすること、すなわち方法を含むエージェントプロトコルを遵守しなければならない.これにより、新しいエージェントを交換すると同時に、メソッドを書き直す必要がなく、新しいエージェントがこのプロトコルを遵守するだけでよい.第二に、Personの声明では、クラス名の代わりにidを採用しています.idは万能ポインタに属しています.これにより、新しいエージェントを交換しながらクラス名を変更することを回避できます.次のようになります.
@property (nonatomic, strong) id delegate;
ここまでOCのすべての文法を学びましたが、知識は絶えず消化吸収する必要があります.私たちはただ一度理解しただけで、知識に対する理解を深めるためにもっと多くのコードが必要です.
-Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、コミュニケーションを期待!--