ダークホースプログラマー---OC ARC管理とCategory

5240 ワード

---Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、ご交流お待ちしております!------
一、ARC
 1.ARC原理
ARCはOBjective-cコンパイラの特性であり、実行時の特性やゴミ回収メカニズムではなく、ARCが行うのはコードコンパイル時にreleaseやautoreleaseを自動的に確認した位置に挿入することにすぎない.
ポインタ分類:キーワード_strong強ポインタ(デフォルトは強ポインタ)
キーワード__Weak弱ポインタ
ARCメカニズム_
1)ARCメカニズムか否かの判断
アイテム情報を表示するにはretain release autorelease retainCountを使用できません
dealllocでは[suoer dealloc]は使用できません.
2)使用:オブジェクトを手動で解放せずに正常に作成
ARC準側判定は、強いポインタが対象を指さない限り、対象は回収される
 2.ARC発注対象メモリ管理
     1) @autoreleasepool {
//ARCではオブジェクトが解放される判断根拠:オブジェクトに強いポインタがない場合、オブジェクトは直ちに解放される
//bigBen強ポインタ(デフォルトは強ポインタ)
      Car *bigBen =[[Car alloc]init];
//bigBenの指向が変わり、Carオブジェクトには強いポインタ指向がないので、すぐにオブジェクトを解放します
     bigBen =nil;
    [bigBen  run];
       }
       
      2) Car *bigBen =[Car  new];
         __weak Car*bwm =bigBen;
         bigBen =nil;
 
BigBenは強いポインタです.他の内容を指し直したが、オブジェクトには強いzhizはない.
弱いポインタはオブジェクトの解放時に自動的に自分でnilを割り当てます
 3.ARCでのマルチオブジェクトメモリ管理
    @class Dog;
    @interfance Person : NSObject
//ARCメカニズムでretainを使用できない場合はstrongまたはweakを使用する
  @property (nonatomic,strong) Dog*dog;
     Dog *byd= [Dog new];
     Person *p =[Person new];
     p.dog =byd;
1)@property(nonatomic,weak)Dog*dog
byd=nilの場合、Dogオブジェクトはすぐに解放されます.オブジェクトに強いポインタがない必要があります.
2)@property(nonatomic,strong)Dog*dog;
     byd =nil;personは強いポインタがないと解放され、Dogも解放されます.
 4.ARCでのループ参照の問題
    @porperty (nonatomic,strong)Dog*dog;
    @porperty (nanatomic,strong)Person*peron;
         Dog*dog =[Dog new];
         Person*person =[Person new];
      person.dog ;  dog.owner;循環参照を構成
このように繰り返し参照されます.dogもpersonもローカル変数で、最初から彼のコードブロックの終わりまで
dogのポインタがperson personを指すポインタがdogを指すのは強いポインタなので解放できないので、ここではループリファレンスのときに1つのオブジェクトがstrongで1つweakで解放できるはずです.
ARC下setメソッドメモリ管理@porpertyパラメータ
ARCの@property
strong:ocオブジェクトに使用され、MRCのretainに相当します.
Weak:ocオブジェクトに使用するMRCのassignに相当
assign:MRCのassignと同様に基本データに使用
copy:MARのcopyと同じNSStringに一般的に使用されます
ARCの場合「ループretain」の問題を解決:@porpertyはstrongを使いながらweakを使う
 5.ARC使用上の注意
1)ARCは,弱いポインタが指すオブジェクトが存在しない限り,直接弱いポインタをクリア(nilに値を付与)操作する.
    2)__weak Person *p=[[Person alloc] init];//不合理で、オブジェクトが作成されると解放され、オブジェクトが解放された後、ARCはポインタをnilに設定します.
3)ARCではporperty処理でretainではなくstrongを使用する、deallocでは[super dealloc]は不要である.
       @property(nonatomic,strong)Dog*dog;
//生成されたメンバー変数を意味する_dogは強いポインタで、以前のretainに相当します.
4)弱いポインタに変更するとweakに変更され、プラスする必要はありません. _.
 
 6.ARCの互換性と交換
プログラムをARCと非ARC部分と互換させ、非ARC-fno-obj-arcに変換してARC f-objc-arcに変換する
 
二、Category
    1.分類の概念と役割
概念:Categoryには多くの中訳があります:分類別類類目(一般的に分類と呼ばれます)
Categoryはoc特有の文法で、他の言語にはない言語です.
分類の役割
既存のクラスを修飾しない上で新しい方法を追加する
巨大なクラスはモジュール開発に分けることができます
膨大なクラスは複数の人間が作成でき、チームと協力するのに有利です.
分類の使用
            1.既存クラスの拡張
            2.サブクラスの代替手段として
            3.クラスのメソッドの分類
注意:分類の名前付きクラス名+拡張方法
   2.分類宣言の実装
分類:いくつかのメソッドの宣言と実装
役割:クラスのソースコードを変更せずに、クラスに新しい機能を追加
宣言@interface拡張クラス名(分類の名前)
          @end
Person+base分類ファイルの命名規則
 
インプリメンテーション
@implementation拡張付きクラス名(分類の名前)
         @end
分類に書かれている方法の手順はクラスと何の違いもありません.分類の使用方法は、既存のオブジェクトを使用するのと同じです.
  
 3.分類の使用上の注意事項
1)分類の宣言にメソッドを追加するしかなく、メンバー変数@propertyを追加することはできません(コンパイラがエラーを報告しない可能性がありますが、実行に問題があります)
2)分類元のクラスのメンバー変数にアクセスできる
3)分類のメソッドが元のクラスと同じ名前の場合,分類中のメソッドを優先的に呼び出すと,元のクラスのメソッドは無視される.
4)複数の分類方法が同一である最後にコンパイルされたその方法が最初に実行される.
 4.Category非公式プロトコル
非公式協議
非公式プロトコルは通常NSObjectのカテゴリとして定義されます
いわゆる非公式プロトコルカテゴリ、すなわちNSObjectまたはそのサブクラスFoundationフレームワークの
   
    NSString *str = @"das435fgfh";
       ----- ------
 
 #import 
 
 @interface NSString (NSStringCount)
 
 -(void)countNumForStringt;
 
 @end
 
 #import "NSString+NSStringCount.h"
 
 @implementation NSString (NSStringCount)
 
 - (void)countNumForStringt{
 int count=0;
 // 
 for (int i=0; i='0'&&ch <='9') {
 count++;
 }
 }
 NSLog(@"%@ %d",self,count);
 
 }
 @end
 #import 
 #import "NSString+NSStringCount.h"
 int main(int argc, const char * argv[]) {
 @autoreleasepool {
 
 NSString *str1 =@"hihasd345";
 [str1 countNumForStringt];
 
 
 }
 return 0;
 }

 
 5.分類(Category)延長
クラスの拡張の概念:
拡張カテゴリは、名前の末尾を拡張する匿名(空)とも呼ばれ、新しい追加方法は必ず実現されます.
      @intreface Person ()
      @end
延長は特殊な分類です
特徴; 
1)拡張でインスタンス変数を定義できる
2)@implementationクラス名()を使用してカテゴリを実装できない方法
3)拡張によって実現される方法はプライベート(相対的)である.
4)作用は私有の変数方法を定義することができる
カテゴリとクラス拡張の違い
1カテゴリにメソッドしか追加できません
       2.拡張クラスはメソッドを追加するだけでなく、インスタンス変数を追加することもできます.ただし、このインスタンス変数はデフォルトでプライベートタイプです.
       3.クラス拡張で宣言されたメソッドは実装されず、コンパイラは警告しますが、カテゴリ内のメソッドが実装されていないとコンパイラは警告しません.これはクラス拡張のためにコンパイルフェーズでクラスに追加されるべきです.カテゴリは、実行時にクラスに追加されます.
       4.クラス拡張はカテゴリのように独立した実装部分を持つことはできない.すなわち、クラス拡張が宣言する方法は、対応するクラスの実装部分に依存して実装されなければならない.
       5.定義は.mファイルにおけるクラス拡張方法は私有方法であり、定義は.hファイル内のクラス拡張方法は公有である.クラス拡張は.mファイルに私有メソッドを明記する非常に良い方法