【问题标题】:Memory leak while assigning rootviewcontroller分配 rootviewcontroller 时内存泄漏
【发布时间】:2013-10-16 20:37:26
【问题描述】:

仪器在self.window.rootViewController= navigationController; 显示 100% 的内存泄漏。应用程序使用 ARC。 UINavigationController,UIViewController 和 window 都是具有强属性的属性。 我该如何解决这个泄漏。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    txnObserver = [[InAppPurchaseObserver alloc] init];
        txnObserver.delegate = self.viewController;
        [[SKPaymentQueue defaultQueue] addTransactionObserver:txnObserver];

    navigationController = [[UINavigationController alloc]initWithRootViewController:viewController];
        **self.window.rootViewController= navigationController;**
        [self.window makeKeyAndVisible];
        return YES;
}

相同的代码在 iOS 6 中没有显示任何泄漏,但在 iOS 7 中显示了泄漏。

于 2013 年 10 月 10 日更新了问题的详细信息。

【问题讨论】:

  • 所以泄漏就在那条线上。但是什么对象在泄漏?
  • 您是否收到任何错误消息?喜欢 - 消息发送到解除分配的实例?或其他一些错误信息?如果应用意外崩溃也要回复?
  • 内存泄漏显示在 self.window.rootViewController= self.navigationController;
  • 实际上它是由仪器显示的,但仪器并没有告诉准确的泄漏线。如果泄漏,我无法理解真正的原因。
  • @Steven Fisher 实际上我是 iOS 开发新手。我没有得到导致泄漏的对象。但正如我告诉仪器显示那条线。

标签: iphone ios memory-leaks automatic-ref-counting


【解决方案1】:

您可以通过以下代码更改您的didFinishLaunchingWithOptions,而无需 @property of viewController :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

@property (nonatomic, strong) ViewController *viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

【讨论】:

  • 感谢您的回答,但它不适用于我的代码。实际上 viewController 也用于其他地方,所以我必须为 viewController 创建属性。
  • 我无法理解确切的问题,但您提出的解决方案对我不起作用。它仍然显示内存泄漏。
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多