1

アプリケーション全体で必要なnsmutablearrayがあるので、アプリケーションデリゲートで宣言し、アプリケーションデリゲートのdeallocメソッドでリリースします。これがそのためのコードです。

@interface AppDelegate : UIResponder <UIApplicationDelegate>{
    NSMutableArray *arr1;
    IBOutlet UINavigationController *navConroller;
}
@property (strong, nonatomic) IBOutlet UIWindow *window;
@property (nonatomic, retain) UINavigationController *navConroller;
@property (nonatomic, retain) NSMutableArray *arr1;


@implementation AppDelegate
@synthesize navConroller;
@synthesize window = _window;
@synthesize arr1;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.arr1 = [[NSMutableArray alloc] init];
    [self.window addSubview:navConroller.view];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)dealloc
{
    [self.arr1 release];
    [_window release];

    [super dealloc];
}

メモリパフォーマンスツールを確認すると、メモリリークが表示されます。

self.arr1 = [[NSMutableArray alloc] init];

この配列をさまざまなクラスで使用しています。任意の提案をいただければ幸いです。

私はPieterGunstの回答を使用し、その場所でリークストップを行いました。しかし、それは別の場所で表示されています。ここで、jsonをペアリングし、レコードをarr1に保存します。これがそのためのコードです。

-(void) apiCall:(NSString *)para1 {
    SBJSON *parser = [[SBJSON alloc] init];

    para1 = [para1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    para1 = [para1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString *url = [[[NSString alloc] initWithFormat:@"my api url",para1] autorelease];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 

    arr1 = [parser objectWithString:json_string error:nil];

    [json_string release];
    [parser release];

}

次の行にリークが表示されます。

arr1 = [parser objectWithString:json_string error:nil];

なにか提案を ?

4

3 に答える 3

2

配列を割り当て、プロパティにアクセスして保持しました。以下のコード行を変更します。

self.arr1 = [[NSMutableArray alloc] init];

以下のいずれかの行で。

arr1 = [[NSMutableArray alloc] init];

また

self.arr1 = [NSMutableArray array];

また

NSMutableArray *tArr1 = [[NSMutableArray alloc] init];
self.arr1 = tArr1;
[tArr1 release];
于 2012-07-31T09:50:26.347 に答える
1

試してみ@synthesize arr1 = _arr1;_arr1 = [[NSMutableArray alloc] init];

于 2012-07-31T09:51:56.967 に答える
0

Apurvがすでに述べたように使用

self.arr1 = [NSMutableArray array];

また

self.arr1 = [[[NSMutableArray alloc] init] autorelease];

また、同じタイプのすべてのプロパティを作成します(強く混合して保持しないでください)。

@property (strong, nonatomic)

また、deallocメソッドの場合は、自動生成されたゲッター/セッターを使用します。

- (void)dealloc {
    self.arr1 = nil;
    self.window = nil;
    [super dealloc];
}

ヒント:

トピックスターターはARCを使用しません。

[super dealloc];

エラーの原因「ARCは「dealloc」の明示的なメッセージ送信を禁止しています」

于 2012-07-31T10:05:49.190 に答える