16

私はobjective-cが初めてで、メモリ管理を理解しようとしています。


Apple による優れたCocoa のメモリ管理プログラミング ガイドを読んだ後、私の唯一の懸念は、自動解放されたオブジェクトが実際に iPhone/iPod アプリケーションで解放されたときです。私の理解は、実行ループの最後にあります。しかし、アプリケーションで実行ループを定義するものは何でしょうか?

それで、次のコードが正しいかどうか疑問に思っていました。オブジェクトを仮定する

@implementation Test

- (NSString *) functionA {
    NSString *stringA;
    stringA = [[[NSString alloc] initWithString:@"Hello"] autorelease]
    return stringA;
}

- (NSString *) functionB {
    NSString *stringB;
    stringB = [self functionA];
    return stringB;
}

- (NSString *) functionC {
    NSString *stringC;
    stringC = [self functionB];
    return stringC;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString* p = [self functionC];
    NSLog(@"string is %@",p);
}

@end

このコードは有効ですか?

リンゴのテキストから、 functionAから返された NSString がfunctionBのスコープで有効であることを理解しています。functionCviewDidLoadで有効かどうかはわかりません。

ありがとう!

4

2 に答える 2

18

はい、あなたの関数は有効であり、retain/release/autorelease/copy の正しい Cocoa 規則を使用してオブジェクトを返します。

ランループとは何かという質問に答えるために、アプリケーションの main() 関数で UIApplicationMain() を呼び出します。UIApplicationMain が次のようになっていると想像できます。

void int UIApplicationMain (int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName) {
    UIApplication *app = /* create app using principalClassName */;
    [app setDelegate:/* create delegate using delegateClassName */];
    while (![app shouldTerminate]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        event = [app getNextEvent];
        [app dispatchEvent:event];
        [pool drain];
    }
}

その while ループは、UIKit が実際に行っていることと似ており、その while ループを通過するたびに、関数 getNextEvent が何らかのイベントの発生を待機するのをブロックする runloop を通過するのと似ています。通常、すべてのメソッドは、dispatchEvent: などの内部から呼び出されます。メソッドの 1 つ (IBAction など) にブレーク ポイントを設定し、デバッガー コール スタックの最上部を調べて、イベントと実行ループを処理する UIKit メソッドの名前を確認してみてください。各メソッドはその while ループ内から呼び出されるため、オブジェクトで autorelease を呼び出すたびに、そのオブジェクトは実行ループの外部プールに追加されます。現在のイベントのディスパッチが完了すると、プールが空になり、それらのオブジェクトに最終的にリリース メッセージが送信されます。

最後のメモ。常にイベント ループの最後にあるとは限らない、複数の自動解放プールが存在する可能性があります。場合によっては、イベント ループを介して 1 回のトリップで何万ものオブジェクトを割り当てることがあります。その場合、独自のメソッドで追加の内部自動解放プールをセットアップして、自動解放プール内の自動解放されたオブジェクトの数を抑えることができます。自動解放プールは積み重ねることができます。

于 2010-03-23T08:46:56.097 に答える
0

そのコードに問題はありません。期待どおりにコンパイルおよび実行されます。

から返されたNSStringオブジェクトは、現在それを追跡してfunctionAいる次の男 ( ) にスタックを渡されているため、返されても有効です。functionB

于 2010-03-23T08:05:27.750 に答える