2011-01-08 15 views
0
Iがobj-Cでの私の最初のステップのために 無用事をやっている

NSStringの継承

@interface String : NSString 
{ 
    int m_isnull; 
} 

- (id) init; 
- (int) isNull; 
@end 


@implementation String 

- (id) init 
{ 
self = [super init]; 

    m_isnull=1; 
    return self; 
} 

- (int) isNull 
{ 
    return m_isnull; 
} 

@end 

テスト:

String *a; 

[email protected]"ok"; 

が正常に動作しますが、わずか2少し質問
1)私がコンパイルしているときに、私はこの警告があります。

warning: incompatible Objective-C types assigning 'struct NSString *', expected 'struct String *' 

私はそれを避ける方法がわからないのですか?

2)a = @ "ok"は文字列を初期化する最も速い方法ですが、私がデバッグしているときは、私のinitコンストラクタで止めません。なぜですか?

+1

NSStringをサブクラス化することは、経験のあるココア開発者が決して行うことではありません。私は心からあなたがやっていることをしないことをお勧めします。 –

+0

確かにDave。しかし、それは新しいObj-C開発者のための共通の落とし穴です:) –

+0

もちろん、私が言ったようにそれは役に立たないです... !!! – Stef

答えて

2

@"ok"はNSStringオブジェクトです。スーパークラスのインスタンスを作成し、それをサブクラスポインターに割り当てようとしています。サブクラス化を「is-a」関係と考えてください。あなたの例では、StringNSStringです。 NSStringではなく、であり、Stringである。したがって、StringポインタにNSStringオブジェクトを割り当てることはできません。

+0

ありがとう、あなたの答えはクールです(単に「しないでください」よりも良い) – Stef

3

@"ok"は実際には1のようなNSStringは整数です。だからあなたはこのコンパイラの警告を得る。

NSStringリテラルもあります。 NSStringの+ stringWithUTF8String メソッドの略称です。マックプレーヤー は、すでに通常http://guides.macrumors.com/Objective-C_Tutorial#The_.40_symbol

あなたはObjective-Cの中Categoryを作成しますC.

のchar *文字列リテラル

ソースから文字列リテラル のこの種を区別 に使用されていることを述べましたNSStringクラスを拡張します。

+0

2つの異なるタイプを使用すると警告につながるので、明らかにそうではありませんが、ここでクラスは同じタイプをオーバーライドします... – Stef

+0

カテゴリ、ありがとう... – Stef

3

NSStringクラスリファレンスを見てみましょう:

NSStringの(とNSMutableString)をサブクラス化することが可能であるが、これは(サブクラスによって継承されていない)文字列のストレージ機能を提供し、実装する必要があり2つの原始的な方法。抽象NSStringとNSMutableStringクラスは、特定の状況に適した文字列オブジェクトを作成して返すprivate、concreteクラスから大部分を成すクラスクラスタのパブリックインターフェイスです。このクラスターの独自のサブクラスを作成すると、特定の要件が課せられます(「オーバーライドするメソッド」を参照)。

本当に-isNullメソッドをNSStringに追加する場合は、カテゴリとして追加するほうがよいでしょう。

代わりに-(BOOL) isNotBlankと書いてみてください。あなたがゼロポインタ上で-isNullを呼び出すとどうなるか考えてみてください。戻り値は期待通りですか?