0

iOS 3.0 が登場したとき、私はいくつかのiOS開発を行いましたが、2 年間、iOS がどのように機能しているかを把握できませんでした。

あなたがiOS3.0 で保持していたことを覚えています。これは、これまでのところ私を困惑させている唯一のことです。

最後になりましたが、ARC を使用する iOS 5 ではデフォルトでローカル変数が強力であるという考えがあります。セッターを持たない選手がいるとしたら、どうすれば強くなれるのでしょうか? (例として、id.)

私が何を意味するかを説明するためのいくつかのコード:

+(double) popOperandOffStack:(NSMutableArray *) stack{
    double result = 0;

    id topOfStack = [stack lastObject];

// how is topOfStack retaining [stack lastObject] if it's simply id?

    if (topOfStack) [stack removeLastObject];

    if ([topOfStack isKindOfClass:[NSNumber class]]){
        result = [topOfStack doubleValue];
    }
    else if ([topOfStack isKindOfClass:[NSString class]]){

        if ([topOfStack isEqualToString:@"+"]){
            result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"-"]){
            result = [self popOperandOffStack:stack] - [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"*"]){
            result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack];
        }

        if ([topOfStack isEqualToString:@"/"]){
            result = [self popOperandOffStack:stack] / [self popOperandOffStack:stack];
        }


    }

    return result;
}
4

2 に答える 2

2

コンパイル時に正確な型を知らなくても、オブジェクトにメッセージを送信できます。実際、配列から返されたオブジェクトにメッセージを送信するときは、これを日常的に行っています。id正確な型にキャストする必要はありません。メッセージを送信するだけで、Objective C はそれを正しくディスパッチします。この規則の唯一の例外は、ドット.構文を使用してプロパティにアクセスすることです。そこではキャストが必要です。

からクラスを継承するすべてのオブジェクトは、、 、 などNSObjectに応答します。ARC が知る必要があるのはこれだけです。最悪の場合、オブジェクトが無効なものを指している場合、「オブジェクトがセレクターに応答しません」というメッセージが表示されます。retainreleaseautoreleaseid

于 2012-07-21T04:32:17.803 に答える
1

プロパティをインスタンス変数とローカル変数と混同しているようです。

変数にはセッターがありません。プロパティにはセッターがあります。どのタイプのプロパティもセッターを持つことができます (場合によっては void を除く)。インスタンス変数はたまたまプロパティに対応する場合がありますが、変数自体には「セッター」がありません。ARC の下であってもobj->ivar、セッターを呼び出すことはありません。

ARC は単純に次の 3 つのことを行います。

  1. retain、、、およびreleaseを挿入します。あなたが書くときautoreleasedealloc

    // ARC
    {
      id foo = [array lastObject];
      ...
    }
    

    それはおよそに翻訳されます

    // MRC
    {
      id foo = [[array lastObject] retain];
      ...
      [foo release];
    }
    

    Objective-C の命名規則を使用して、何を保持および解放する必要があるかを判断します。いくつかの最適化があります (実際には、 ARC 仕様objc_retain()で説明されている理由で と フレンドを使用します。また、自動解放されたオブジェクトをより効率的に処理するための関数がいくつか追加されています。)-autorelease

  2. __strongあなたのためにイヴァールを解放して-deallocください。プロパティ セッターは呼び出されません。それはただイヴァールを解放するだけです。に設定することもできますnil

  3. 弱参照のゼロ化。変数は、直接アクセスするのではなく、友達と__weak読み書きします。弱い参照のゼロ化を正しく実装するためにobjc_copyWeak()、(またはそのような) 追加のフックがあります。-[NSObject release]

さらに、ブロックと変数を取り巻くセマンティクスは、__blockMRC を介して複製するのが容易ではない方法で変更されます。それとは別に、ARCランタイムサポート関数呼び出しを呼び出すことで、ARCが行うことはすべて複製できると思います。

ARC とセッターの間の唯一の接続は、コンパイラが ivar アクセスで保持/解放を挿入するため、多くのプロパティを取り除くことができるということです。

于 2012-07-21T05:24:58.360 に答える