OC面接チェックリスト

4326 ワード

@propertyにはどのようなプロパティキーがありますか?
@propertyと@synthesizeはペアで表示され、クラスメンバー変数のアクセスメソッド(getterとsetter)を自動的に生成できます.Xcode 4.5以降のバージョンでは、@synthesizeは省略できます.
  • atomicとnonatomic atomic:デフォルトでは、プログラムがマルチスレッドの場合、コンパイラが自動的に反発ロックコードを生成することを保証するために、変数の読み書きが同期しないという問題を回避し、マルチスレッドのセキュリティを提供します.nonatomic:オブジェクトがマルチスレッドを考慮する必要がない場合は、このプロパティを追加します.これにより、コンパイラは反発ロックコードを生成しにくくなり、マルチスレッド、変数保護を禁止し、パフォーマンスと効率を向上させます.注意:atomicはObjcが使用するスレッド保護技術で、基本的には書き込みが完了していないときに別のスレッドが読み込まれ、データエラーが発生することを防止します.このメカニズムは非常にシステムリソースを消費するので、iPhoneのような小型デバイスでは、マルチスレッド間の通信プログラミングを使用していなければ、nonatomicは非常に良い選択です.iOS開発ではnonatomicが一般的に使われているのも性能に基づいている.
  • readwriteとreadonly readwrite:このプロパティがデフォルトの場合、自動的にアクセスが生成されます.readonly:getterのみが生成され、setterメソッドは生成されません.注意:readwrite、readonlyの2つのプロパティの真の価値は、メンバー変数へのアクセスインタフェースではなく、メンバー変数へのアクセス権限を制御します.
  • strongとweak strong:強い参照は、私たちが一般的に言っている参照でもあり、その存亡は直接指向するオブジェクトの存亡を決定し、強い参照があるオブジェクトを指向すると、そのオブジェクトが所有されます.オブジェクトへの参照が存在せず、オブジェクトが使用されなくなった場合、オブジェクトはメモリから解放されます.デフォルトのすべてのインスタンス変数とローカル変数はstrongポインタです.weak:弱い参照は、オブジェクトの存亡を決定せず、単純にオブジェクトを参照しているが、そのオブジェクトを所有していない.オブジェクトが無数の弱い参照を持っていても、強い参照がない限り消去されます.注意:strongはretain機能と似ています.Weakはassignと似ていますが、オブジェクトが消えるとweakは自動的にポインタをnilに設定し、野ポインタの発生を回避するので、weakプロパティはdeallocにnilを置く必要はありません.
  • assign、copy、retain assgin:デフォルトタイプ、setterメソッドは直接値を割り当て、retain操作を行わず、参照カウントを変更しません.一般的には、基本データ型を処理するために使用されます.retain:古いオブジェクト(release)を解放し、古いオブジェクトの値を新しいオブジェクトに割り当て、新しいオブジェクト参照数を1にします.ポインタコピーと理解できます.copy:retainの流れと同様に、古い値releaseを先に、新しいオブジェクトをcopyで出し、参照カウントを1とし、コンテキストへの依存を減らすために導入されるメカニズム.コンテンツのコピーと理解できます.つまり、コンテンツがcopyされると、メモリに同じコンテンツが2つ格納されることを意味します.注意:assignの使用:ベース・データ型(NSInteger,CGFloat)およびCデータ型(int,float,double,charなど)の使用copyの使用:NSStringの使用retainの使用:他のNSObjectおよびそのサブクラス
  • の使用
    @synthesizeと@dynamicはそれぞれどんな役割を果たしていますか?
    簡単に言えば,@synthesize命令によりコンパイラにコンパイル中にgetterとsetterメソッドを生成するように伝える.getterメソッドとsetterメソッドをカスタマイズすると、コンパイラが生成してくれたメソッドが上書きされます.@dynamicコマンドは、コンパイラがコンパイル中にgetterメソッドとsetterメソッドを自動的に生成しないことを示し、コンパイル中に警告が発生しないようにします.次に、独自のアクセスメソッドまたはアクセスメソッドによって実行時にバインディングが動的に作成されます.その主な役割はNSManageObjectオブジェクトの属性宣言で使用されます.このようなオブジェクトの属性は一般的にCore Dataの属性から生成されるため、Core Dataフレームワークはプログラムの実行時にこのような属性のgetterとsetterメソッドを生成します.
    ARCで属性キーを明示的に指定しない場合、デフォルトのキーはどれですか?
    atomic,readwrite,strong(オブジェクト)、assgin(基本データ型).
    @propertyで宣言されているNSString、NSArray、NSDictionaryではcopyキーがよく使われていますが、なぜですか?strongキーワードを変更すると、どのような問題が発生しますか?
    この問題はcopy、strongという2つの修飾子に対する理解を考察することにほかならない.簡単に言えばstrongは強い参照であり、依然として同じメモリアドレスを指している.copyはコンテンツコピーであり、コピーされたコンテンツを格納するために別のメモリスペースが開き、ポインタが異なるメモリアドレスを指します.copyは可変オブジェクトを返します.strongで可変オブジェクトを修飾すると、このオブジェクトは何気なく修正される可能性があります.これは私たちが見たいものではありませんが、copyではこのような意外なことは起こりません.
    @synthesize合成インスタンス変数のルールは何ですか?property名がfooの場合、_という名前が存在します.fooのインスタンス変数は、新しい変数を自動的に合成しますか?
    @synthesizeは、コンパイラによって属性を自動的に実現するgetter/setterメソッドを表し、自分で手動で実現する必要はありません.デフォルトでは、インスタンス変数の名前を指定する必要はありません.コンパイラは自動的にプロパティ名に「」を付けます.に表示されます.もちろん実装コードに@synthesize構文でインスタンス変数の名前を指定することもできます.例えば@synthesize foo = oof(oofはあなたが定義したい名前です).property名がfooであり、_という名前が存在する場合fooのインスタンス変数では、コンパイラは新しい変数を自動的に合成しません.次のコードは、より良い理解を助けることができます.
    @interface ViewController : UIViewController
    @property (copy, nonatomic) NSString *testA;
    @property (copy, nonatomic) NSString *testB;
    @end
    
    @interface ViewController ()
    {
        NSString *_testA;
        NSString *_testB;
    }
    @end
    
    @implementation ViewController
    
    @synthesize testB = testBBBBB;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.testA = @"1111";
        self.testB = @"1111";
        // :self.testA = 1111,_testA = 1111,self.testB = 1111,testBBBBB = 1111,_testB = (null)
        NSLog(@"self.testA = %@,_testA = %@,self.testB = %@,testBBBBB = %@,_testB = %@",self.testA,_testA,self.testB,testBBBBB,_testB);
        
        _testA = @"2222222";
        _testB = @"2222222";
        // :self.testA = 2222222,_testA = 2222222,self.testB = 1111,_testB = 2222222,testBBBBB = 1111
        NSLog(@"self.testA = %@,_testA = %@,self.testB = %@,_testB = %@,testBBBBB = %@",self.testA,_testA,self.testB,_testB,testBBBBB);
        
        testBBBBB = @"333333";
        // :self.testB = 333333,testBBBBB = 333333,_testB =2222222
        NSLog(@"self.testB = %@,testBBBBB = %@,_testB =%@",self.testB,testBBBBB,_testB);
    }
    

    グループと一緒に交流して共同学習することができます:801216530.