iPhone委托和控制器dealloc?

Posted

技术标签:

【中文标题】iPhone委托和控制器dealloc?【英文标题】:iPhone delegate & controller dealloc? 【发布时间】:2010-01-15 22:00:55 【问题描述】:

我一直在玩一个简单的 iphone 应用程序,并决定将 NSLog 语句放在控制器和委托的 dealloc 中,但这些都没有打印到 Xcode 控制台?

// 申请委托

#import "iPhone_buttonFunAppDelegate.h"
#import "iPhone_buttonFunViewController.h"

@implementation iPhone_buttonFunAppDelegate

@synthesize window;
@synthesize viewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application        
    // Override point for customization after app launch
    NSLog(@"applicationDidFinishLaunching ...");
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];


- (void)applicationWillTerminate:(UIApplication *)application 
    NSLog(@"AWT:");


- (void)dealloc 
    NSLog(@"-DEL-"); // << Does not print?
    [viewController release];
    [window release];
    [super dealloc];

@end

// 查看控制器

#import "iPhone_buttonFunViewController.h"

@implementation iPhone_buttonFunViewController
@synthesize statusText;

-(IBAction)buttonPressed:(id) sender 
    NSString *title;
    NSString *newText;

    title = [sender titleForState:UIControlStateNormal];
    newText = [[NSString alloc] initWithFormat:@"%@ button pressed.", title];
    [statusText setText:newText];
    [newText release];
    NSLog(@"Button Press ... %@", title);


-(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.
    NSLog(@"-1-");


-(void)viewDidUnload 
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    NSLog(@"-2-");
    self.statusText = nil;


-(void)dealloc 
    NSLog(@"-CON-"); // << Does not print?
    [statusText release];
    [super dealloc];

@end

加里

【问题讨论】:

【参考方案1】:

这是 Cocoa touch 运行时的优化。某些释放不会在程序结束时进行,因为整个程序将退出并且无论如何它们都会被清除。

【讨论】:

所以基本上我在那里的所有版本都没有完成,清理本质上是应用程序正在退出并且它的足迹无论如何都会被清理的事实? 正确。 AppDelegate 的 dealloc 方法在正常的程序操作中永远不会被调用。【参考方案2】:

NSLog(...) 的这个问题可以由this other *** question about applicationWillTerminate: 来回答

祝你好运。

【讨论】:

谢谢,可能是 iPhone_buttonFunAppDelegate 的 dealloc(以及 iPhone_buttonFunViewController dealloc)在 applicationWillTerminate 之后被调用。在这种情况下,不会再输出 NSLog。 是的,deallocs 通常在此之后出现。控制台有你的 NSLog(...)s 吗? 当您按下模拟器主页按钮时,系统控制台中显示的最后一件事是来自 applicationWillTerminate 的 NSLog。虽然这是模拟器和 Xcode 之间的连接中断的地方,但重新进入应用程序会导致 NSLogs 只进入系统控制台,但您仍然看不到来自任一 dealloc 的 NSLogs。 是的,如果我不得不猜测它们实际上并没有得到 dealloc'd,因为它们的引用计数永远不会为零,而且它们只是得到了“磁带末尾”的处理。

以上是关于iPhone委托和控制器dealloc?的主要内容,如果未能解决你的问题,请参考以下文章

找不到协议声明自定义协议委托 iphone

如何将委托设置为零?

关于iOS8上使用UITextView内存泄漏的一个坑:-[UITextView textInputView]: message sent to deallocated instance

Dealloc 不称为更改选项卡

如何将标签栏控制器放在视图控制器而不是委托中?

循环引用不释放控制器