0

プロジェクトを anylayze すると、オブジェクトの潜在的なリークが大量に発生します。そのオブジェクトを解放しようとすると、「someobject send to deallocated instance」というエラーが発生します。

オブジェクトを解放する場所が完全に理解できませんでした。iOS 4.3 以上のバージョンをサポートする必要があります。Google を調べたところ、iOS 5 から ARC が有効になっていることがわかりました。

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];  

    ViewController *searchController=[[ViewController alloc]initWithNibName:@"ViewController_iPad" bundle:nil];
    OptionsViewController *optionview=[[OptionsViewController alloc]initWithNibName:@"OptionsViewController~iPad" bundle:nil];
    optionview.title=@"Options";
    LogOut *logout=[[LogOut alloc]initWithNibName:@"LogOut~iPad" bundle:nil]; // method retains objective-c object with +1 retain count
    logout.title=@"Sign Out";
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:searchController, optionview,logout, nil]; //Object leaked:object allocated and stored into logout is not referenced later in this execution path and has a retain count of +1
    [self.window addSubview:tabBarController1.view];  [self.window makeKeyAndVisible];
    CGRect  rect = [[UIScreen mainScreen] bounds];
    [self.window  setFrame:rect];   
    return YES; 
 }

私が書くとき

[self.tabBarController release];
[searchController release];
[optionview release]; 
[logout release];

エラー
[self.window setFrame:rect];
が発生した後Bad Excess

オブジェクトを解放するタイミングがわかりませんでした。

4

2 に答える 2

0

まず第一に、ARCはios 4.0以降でサポートされています..アップルのドキュメントによると..

ARC is supported in Xcode 4.2 for OS X v10.6 and v10.7 (64-bit applications) and for iOS 4 and iOS 5. Weak references are not supported in OS X v10.6 and iOS 4.

ソース: http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

そして、これはあなたのコードがどのように見えるべきか..

   ViewController *searchController=[[ViewController alloc]initWithNibName:@"ViewController_iPad" bundle:nil];
    OptionsViewController *optionview=[[OptionsViewController alloc]initWithNibName:@"OptionsViewController~iPad" bundle:nil];
    optionview.title=@"Options";
    LogOut *logout=[[LogOut alloc]initWithNibName:@"LogOut~iPad" bundle:nil]; // method retains objective-c object with +1 retain count
    logout.title=@"Sign Out";
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:searchController, optionview,logout, nil]; //Object leaked:object allocated and stored into logout is not referenced later in this execution path and has a retain count of +1
    [self.window addSubview:tabBarController1.view];  [self.window makeKeyAndVisible];
    CGRect  rect = [[UIScreen mainScreen] bounds];
    [self.window  setFrame:rect];   
    [searchController release];
    [optionview release];
    [logout release];
    return YES; 

autorelease を設定しているので、タブ バー コントローラーを明示的に解放する必要はありません。プロパティに関連付けられた ivar を解放します。

あなたが尋ねた質問を見る..私はあなたがプロパティとインスタンス変数の関係を理解し​​ていないことはほぼ確実です。これらについて、また iOS のメモリ管理についての良いチュートリアルを見つけてください。

これが役立つことを願っています。

于 2013-05-11T07:22:10.210 に答える
-1

あなたが書くなら

   self.tabBarController = [[[UITabBarController alloc] init] autorelease];

[self.tabBarController release] のように、このインスタンスを手動で解放します。その後、常にクラッシュします。

そして、あなたはこれもあなたの質問に書いています

  self.tabBarController = [[[UITabBarController alloc] init] autorelease];
  self.tabBarController.viewControllers = [NSArray arrayWithObjects:searchController, optionview,logout, nil];

tabBarController は autorelease で、そのビューコントローラーを解放しようとしていますか?

これを試して:

       self.tabBarController = [[UITabBarController alloc] init];
      self.tabBarController.viewControllers = [NSArray arrayWithObjects:searchController, optionview,logout, nil];


       -(void)dealloc {
            //release your all objects
             [super dealloc];
        }
于 2013-05-11T06:10:23.383 に答える