0

私はobjective-cにかなり慣れていませんが、そのほとんどは明らかですが、メモリ管理に関しては少し足りません。現在、私のアプリケーションが行うのは、NSURLConnection中にメソッド-(void)connectionDidFinishLoading:(NSURLConnection *)connectionが呼び出されたときです。メソッドを入力してデータを解析し、それを配列に入れて、その配列を返します。ただし、カスタムメソッド(メソッド1、添付のコードを参照)内でメモリから配列を解放しないため、これが最善の方法であるかどうかはわかりません。

以下は、私が何をしているのかをよりよく示すための小さなスクリプトです

.hファイル

#import <UIKit/UIKit.h>

@interface memoryRetainTestViewController : UIViewController {

    NSArray *mainArray;

}

@property (nonatomic, retain) NSArray *mainArray;

@end

.mファイル

#import "memoryRetainTestViewController.h"

@implementation memoryRetainTestViewController
@synthesize mainArray;


// this would be the parsing method
-(NSArray*)method1
{
    // ???: by not release this, is that bad. Or does it get released with mainArray
    NSArray *newArray = [[NSArray alloc] init];
    newArray = [NSArray arrayWithObjects:@"apple",@"orange", @"grapes", "peach", nil];

    return newArray;
}


// this method is actually
// -(void)connectionDidFinishLoading:(NSURLConnection *)connection
-(void)method2
{
    mainArray = [self method1];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    mainArray = nil;
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [mainArray release];
    [super dealloc];
}


@end
4

2 に答える 2

2

はい、newArrayリリースされるmainArrayとリリースされます。しかし、これmethod2は一度呼び出された場合だけです。

私たちは参照について話しているので、あなたが持っているなら

newArray = something
mainArray = newArray
[mainArray release]

両方の変数は、のみを参照しますNSArray*。それならあなたの場合newArrayはただのローカルなので問題はありません。

method22回呼び出すと、問題が発生します。

newArray = something
mainArray = newArray
newArray = something2
mainArray = newArray <- old reference is lost
[mainArray release] <- just something2 is released

mainArrayこの問題を回避するには、参照を別のオブジェクトで上書きする前に、必ず解放する必要があります。

編集:あなたが2回配列を作成していることに気づいていませんでした:)いいえ、それは良くありません。

于 2010-06-08T00:15:14.533 に答える
2

最初-method1に新しい配列を作成し、次にそれを新しい配列で上書きします。

NSArray *newArray = [[NSArray alloc] init]; // first array, retained
newArray = [NSArray arrayWithObjects:...];  // second array, auto-released, 
                                            // pointer to first one lost

最初の配列はここで単にリークされます。また、ivarに格納されている配列をリークしています。これを回避するには、合成セッターを使用してください。保持され、解放されます。

まだ読んでいない場合は、Cocoaのメモリ管理ガイドをお読みください。

より良いバージョン:

- (NSArray *)method1 {
    NSArray *newArray = [NSArray arrayWithObjects:...];    
    return newArray;
}

- (void)method2 {
    self.mainArray = [self method1];
}
于 2010-06-08T00:16:26.777 に答える