2016-04-07 7 views
0

私はC++の背景を持っていると私はOBJのCチュートリアルを通じてつもりだ..私は次の行についての質問だ:Objective Cのコンストラクタ

UIColor *color = [UIColor redColor]; 

ので、正確に何がここで起こっているの?私はそれと仮定します

  1. 私のカラーポインタは赤色のオブジェクトを正しく指しませんか? (そうしないと、コードは

    UIColor *color = redColor; 
    
  2. は、代わりに私は新しい色のオブジェクトを作成していますしなければならない、と2がtrueの場合、私がしようとしているredColor変数

で初期化されていますUIColor.hを見て、コンストラクタがどのように動作するかを参照して(つまり、私はいくつかのコピーコンストラクタタイプコードを探しています)。

しかし、私はどの

が表示されません

とそのコンストラクタは、次のようないくつかの実装を持っている必要があります。

self.r = r; 
self.b = b; 
self.g = g; 

これを行うか、それがデフォルトで生成されたすべてのある機能?

+0

Objective-Cにはコンストラクタがありません。 – Sulthan

+1

'[UIColor redColor]'は[*クラスメソッド*](https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/ClassMethod.html)です。これは、インスタンスなしでクラスに対して直接呼び出されるメソッドです。 – vcsjones

+0

'redColor'メソッドはクラスメソッドであることを示す' + 'で始まり、クラスのインスタンスでは呼び出すことができません。 –

答えて

1

クラスを作成するときに、「クラスメソッド」と「インスタンスメソッド」を作成できます。

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

クラスメソッドは

[MyClass aClassMethod]; 

インスタンスメソッドは、だからあなたの場合には、redColorは、クラスメソッドである

[object anInstanceMethod]; 

のように呼ばれているように呼ばれています。

4

まず、Objective-Cにはコンストラクタがありません。初期化子があります。いくつかの重要な違いがあります:初期化子が継承され、初期化子を複数回呼び出すことができます(ただし、実行しないでください)。本質的に、他の方法と同じように動作します。

Obj-Cのすべてのイニシャライザは、init...で始まります。 UIColorには複数のイニシャライザがあります(例:-initWithWhite:alpha:)。

+[UIColor redColor]は工場の方法です。これはクラスメソッド(クラス上のメソッド)です。

+ (UIColor *)redColor { // we would actually use instancetype instead of UIColor 

    return [[self alloc] initWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]; 
} 

実際の実装ではおそらくシングルトンが返されます。

ほとんどのイニシャライザには、ペアの+colorWithWhite:alpha:など、同じパラメータを持つファクトリメソッドがあります。

UIColor *color = [[[UIColor alloc] initWithWhite:0 alpha:0] autorelease]; 

UIColor *color = [UIColor colorWithWhite:0 alpha:0]; 

がはるかに短くし、入力しやすくしたファクトリメソッドを使用します。オブジェクトを作成するための通常の方法があった場所ファクトリメソッドは、事前ARCのメモリ管理において非常に有用でした。

コピーコンストラクタに関するご質問に関して、Objective-Cでは、通常、この動作はNSCopyingプロトコルを使用して実装されています。 [myColor copy]を呼び出すだけでオブジェクトコピーを取得できます。ただし、UIColorは不変クラスです(新しいインスタンスを作成せずにプロパティを変更することはできません)。したがって、色のコピーを作成する理由はありません。

+0

良い説明。私はここに私の答えを残すでしょうが、私はあなたが良いと思う。 – Almo