IOS面接整理

4237 ワード

#importと#includeの違い@classは?
#importファイルヘッダをインポートすると、自動的にインポートしたかどうかを判断し、重複インポートを回避します.クラスのメソッドとプロパティを参照します.
#includeインポートファイルヘッダは、マクロを定義することによって、インポートを繰り返すかどうかを判断します.
     @class
インタフェースでクラスを参照するには@classを使用します.このクラスはタイプとして使用されますが、インタフェースを実装するファイルでは、このクラスのエンティティ変数やメソッドなどを参照する必要がある場合、または@classで宣言されたクラスをimportする必要があります.
メモリ管理の原則(作成者、解放者)
ARC(Automatic Reference Counting)
√オブジェクトがreleaseによって解放された後、最後にその変数を参照して手動でnilに設定します.そうしないと、野ポインタエラーが発生する可能性があります.空のオブジェクトにメッセージが発生してもエラーは発生しません.
     √     
Cocoaは、親オブジェクトが子オブジェクトを強く参照すべきであり、子変数が親オブジェクトを弱く参照すべきであるという慣例を形成しています.(retain cycle回避)
属性パラメータ
@propertyのパラメータは3種類に分けられます.つまり、パラメータは最大3つまであり、中間はカンマで区切られ、各パラメータは上表の3種類のパラメータから1つ選択できます.設定しない場合、または1つのパラメータのみを設定する場合、プログラムは3つのパラメータのデフォルトパラメータを使用します.デフォルトパラメータ:(atomic,readwrite,assign)
一般的に、マルチスレッド開発で1つの属性が2つ以上のスレッドに同時にアクセスされる可能性がある場合は、atomic属性を考慮することができます.そうしないと、nonatomicを使用することをお勧めします.ロックをかけず、効率が高いです.readwirteメソッドはgetter、setterの2つのメソッドを生成し、readonlyを使用するとgetterメソッドのみを生成します.setメソッドの処理については特に説明する必要があります.属性aを定義するとします.ここでは、3つの方法の生成コードをリストします.
assign、基本データ型用
-(void)setA:(int)a{
    _a=a;
}

retain、通常は文字列以外のオブジェクトに使用されます
-(void)setA:(Car *)a{
    if(_a!=a){
        [_a release];
        _a=[a retain];
    }
}

copy、通常は文字列オブジェクトに使用されます
-(void)setA:(NSString *)a{
    if(_a!=a){
        [_a release];
        _a=[a copy];
    }
}

じどうかいほうそう
     
Autoreleaseメソッドでは、オブジェクトの参照カウンタは変更されません.このオブジェクトを自動解放プールに配置するだけです. 
自動リリースプールは実質的に、自動リリースプールが破棄された後にオブジェクトを呼び出すreleaseメソッドであり、必ずしもオブジェクトを破棄できるとは限らない(例えば、オブジェクトの参照カウンタ>1の場合、この時点で破棄できない). 
自動リリースプールは最後にオブジェクトを統一的に破棄するため、1つの操作がメモリ(オブジェクトが多いか、オブジェクトがリソースを占有しているか)を比較する場合は、自動リリースプールに置かないか、複数の自動リリースプールに置くことを考慮しないほうがいい. 
ObjCのクラスライブラリの静的メソッドは一般的に手動で解放する必要はなく、内部でautoreleaseメソッドが呼び出されています.
self.selfとの違いは?
√@propertyはretain属性を定義し、self.値を割り当てるとsetメソッド(setメソッドにretainがある)が呼び出され、selfはエンティティ変数に直接値を割り当て、setメソッドを通過しません.
単列モード
     +(
Singleton *)sharedInstance
     {
            static 
Singleton * _sharedInstance = nil;
            static dispatch_once_t  oncePredicate;
            dispatch_once(&oncePredicate,^{
                    _sharedInstance = [[
Singleton alloc] init];
            })
               
          return _sharedInstance;
     }
     
   
 +(
Singleton *)sharedInstance
     {
         static 
Singleton * _sharedInstance = nil;
          if(_sharedInstance != null){
               _sharedInstance = [[
Singleton alloc] init];
          }                        
          return _sharedInstance;
     }
アニメーション実装の2つの方式
第1種
[UIView beginAnimations:@"Curl"context:nil];//アニメーション開始[UIView setAnimationDuration:1.25];//アニメーション期間[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//アニメーション速度[U IView setAnimationTransition:U IViewAnimationTransitionCurlUp//タイプ                       forView:self.view  
                         cache:YES];  
[UIView commitAnimations];  
第2種
CATransition *animation = [CATransition animation];   
[animation setDuration:1.25f];   
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];  
[animation setType:kCATransitionReveal];  
[animation setSubtype: kCATransitionFromBottom];  
[self.view.layer addAnimation:animation forKey:@"Reveal"];  
#ifndef/#define/#endif
#ifndef"if not define a.h"が存在しない場合、#defineはデフォルトで導入され、#endif終了フラグ