【问题标题】:nsmutablearray leaking the memory iphonensmutablearray 泄漏内存 iphone
【发布时间】:2012-07-29 01:23:05
【问题描述】:

我有一个 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];

我在不同的类中使用这个数组。任何建议将不胜感激。

我使用了 Pieter Gunst 的答案并在那个地方停止泄漏。但它显示在另一个地方。我在哪里解析 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];

有什么建议吗?

【问题讨论】:

  • 好像没有泄露。

标签: iphone ios ipad memory-leaks nsmutablearray


【解决方案1】:

您已分配数组并通过访问属性保留它。 更改以下代码行;

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

下面的任何一行..

arr1 = [[NSMutableArray alloc] init];

self.arr1 = [NSMutableArray array];

NSMutableArray *tArr1 = [[NSMutableArray alloc] init];
self.arr1 = tArr1;
[tArr1 release];

【讨论】:

  • @BoA 你错了。他正在使用非电弧。在 ARC 代码中,你永远不会调用 [super dealloc];
  • @tikhop 我最近编写了太多 Android 代码,也许他没有。但无论如何,他是在 dealloc 中释放它,所以无论如何都不应该有自动释放。
  • @BoA 是的,但是如果您在代码中看到“strong”属性,这并不意味着代码使用 ARC。强等价于在非 ARC 代码中保留
  • @tikhop 是的,我意识到了。
  • 我试过这两个帖子 self.arr1 = [NSMutableArray array];和@synthesize arr1 = _arr1;和 _arr1 = [[NSMutableArray alloc] init];两者都运作良好。我没有得到区别。谁能解释一下?
【解决方案2】:

试试@synthesize arr1 = _arr1;_arr1 = [[NSMutableArray alloc] init];

【讨论】:

  • 感谢您的回答。我试过这两个帖子 self.arr1 = [NSMutableArray array];和@synthesize arr1 = _arr1;和 _arr1 = [[NSMutableArray alloc] init];两者都运作良好。我没有得到区别。你能解释一下吗?
【解决方案3】:

正如 Apurv 已经提到的那样使用

self.arr1 = [NSMutableArray array];

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

同时使所有属性为同一类型(不要混合强和保留):

@property (strong, nonatomic)

对于 dealloc 方法,使用自动生成的 getter/setter:

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

提示:

主题启动器不使用 ARC,因为

[super dealloc];

导致错误“ARC 禁止 'dealloc' 的显式消息发送”

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2011-12-10
    • 2011-05-24
    相关资源
    最近更新 更多