面接の基礎問題

4412 ワード

(1)自分が書いたオブジェクトにコピー機能を持たせてNSCopyingを実現する方法,NSMtableCopyingプロトコル,runtimeの方法と組み合わせて付与を実現する方法
- (instance)copyWithZone:(NSZone *)zone{
        id model =[[ [self class] allocWithZone:zone]init];
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([self classs],&count);
        for(int i = 0 ,i < count ,i++){
          objc_property_t property = properties[i];
          NSString *propertyName = [NSStirng stringWithUTF8String:property_getName(property)];
          id value = [self valueForKey:propertyName];
          if(value){
              [model setValue:value forKey:propertyName];
          }
        }
        free(properties);
        return model;
}

はい、モデルには配列があり、配列内にはモデルの
- (instance)copyWithZone:(NSZone *)zone{
        id model =[[ [self class] allocWithZone:zone]init];
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([self classs],&count);
        for(int i = 0 ,i < count ,i++){
          objc_property_t property = properties[i];
          NSString *propertyName = [NSStirng stringWithUTF8String:property_getName(property)];
          NSString *propertyAttribute = [NSString stringWithUTF8String:property_getAttributes(property)];
           id value ;
          if([propertyAttribute rangeOfString:@"NSMutableArray"].location != NSNotFound || [propertyAttribute rangeOfString:@"NSArray"].location != NSNotFound){
            value = [[NSMutableArray alloc]initWithArray:value copyItems:YES];
          }else{       
             value = [self valueForKey:propertyName];
          }
         
          if(value){
              [model setValue:value forKey:propertyName];
           }
       }
        free(properties);
        return model;
}

(2)weak属性、およびなぜweakで修飾されたオブジェクトをnil Aに置かないのか:一般的に、ループ参照を防止するためにweakキーワードB:runtimeを用いてweakをどのように実現するのか:weakオブジェクトはhashテーブルに置かれ、weakで指向されたオブジェクトのメモリアドレスをkeyとし、weakで修飾されたオブジェクトをvalueとするweakで指向されたオブジェクトの参照カウントが0の場合、keyに基づいて左右のvalueを見つけてnilとする
NSObject *obj1;
NSObject *obj2 = [NSObject new];
__weak obj1 = obj2;

__weak obj1 = obj2;このコードは実際に呼び出されたobjc_です.storeWeak(&obj1,obj2)【objc_storeWeak(value,key)】;
(3)UIViewとUILayer点この表示(4)@synthesizeと@dynamicの区別点この表示(5)動的バインドOCの動的性は3つの面に現れている:動的タイプ、動的バインド、動的ロードA:動的タイプ:id修飾オブジェクトは動的タイプオブジェクト、(他のコンパイラでタイプを示すオブジェクトは静的タイプオブジェクト)、instancetypeとidはいずれのタイプを表すことができる.オブジェクトのタイプ決定を後で遅らせ、OC言語のダイナミック性を体現し、宣言されたオブジェクトが実行時の特性を持つようにします.instancetypeは戻り値タイプとしてのみ使用できますが、コンパイル期間にinstancetypeが行うタイプ検出idタイプは戻り値タイプとしてもパラメータタイプとしても変数のタイプとしても使用できますが、idタイプはコンパイル期間にタイプ検出されません.
B:動的バインディング:動的バインディングとは方法決定の動的性を指し、具体的にはOCのメッセージングメカニズムを利用して実行する方法を実行時に延期し、主に一部の受信者が処理できないメッセージに対応することを処理する.この時、他の受信者にメッセージを転送する機会がある動的バインディングを処理する核心は、実行時に動的にクラスに属性と方法を追加し、方法の最後の処理または転送である
C:ダイナミックロード、ダイナミックロードは主に2つの方面を含んで、1つはダイナミックリソースロードで、1つはいくつかの実行可能なコードモジュールのロードで、これらのリソースは実行時に必要に応じてダイナミックな選択性のプログラムに参加して、1種のコードとリソースの“怠け者のロード”モードで、メモリの需要を下げることができて、全体のプログラムの性能を高めることができて、また大いに拡張性を高めました.
(6)category,extension,および継承の相違点この表示,他人から転送
  • category

  • categoryはクラスにメソッドとプロパティを追加します(追加したプロパティはsetメソッドとgetメソッドを宣言するだけで、実装はありませんが、関連オブジェクトを使用して実装メソッドを動的に追加できます).
    分類が元のクラスと同じ名前のメソッドが出現した場合、分類の中のものを優先的に呼び出し、1つのクラスに複数の分類がある場合、各分類にAメソッドがあり、Aメソッドの実際の呼び出しはコンパイル順序によって決まり、最後にコンパイルされたファイルは呼び出される(クラスの構造の中でrwのcategory_t**の追加順序に基づいて、クリックしてクラス構造を表示する)
  • extension

  • 形式的には、extensionは匿名のcategory extensionで宣言された方法でimplementationで実現する必要がありますが、categoryは強制的にextensionに属性、メンバー変数を追加することができますが、categoryは一般的にできません.
    extension(1)はコンパイラで決定され,クラスの一部であり,コンパイラとヘッダファイルの@interfaceと実装ファイルの@implementとともに完全なクラスを形成する.クラスの発生に伴って発生し,クラスの消失に伴って消失する.(2)extensionは一般的にクラスのプライベートメッセージを隠すために使用され、クラスのextensionを追加するにはクラスのソースコードが必要です.そのため、nsstringのようなシステムのクラスにはクラス拡張を追加できません.
    category(1)は、実行期間によって決定された(2)クラス拡張でインスタンス変数を追加できます.分類でインスタンス変数を追加できない理由:実行期間中にオブジェクトのメモリレイアウトが決定されているため、インスタンス変数を追加するとクラスの内部レイアウトが破壊され、コンパイル言語に災害が発生します.
  • 複数のクラスが同じインスタンス変数とメソッドを継承する場合、
  • を継承することを考慮する.
    継承とCategoryの違い:1.カテゴリはメソッドの拡張であり、メンバー変数を追加することはできません.継承は、元の親クラスのメンバー変数に基づいて、新しいメンバー変数2を追加することができる.カテゴリには新しいメソッドのみが追加され、元のメソッドは変更および削除できません.継承はメソッドを追加、変更、削除できます.3.カテゴリは従来の方法を再ロードすることを提唱していない.継承はsuperを使用して元のメソッドを再ロードできます.4.カテゴリは継承できます.親クラスでカテゴリが定義されている場合、その子クラスでも継承されます.
    共通点:クラスを拡張する
    (7)なぜエージェントがweak,delegateとdataSourceの違いを使うのか,blockとエージェントの違いをクリックして見る