我想我知道区别,但不知道如何正确解释.
dealloc完全立即删除该变量保留的内存.
release将该变量的内存的retain计数器递减-1.如果它是1,那么它是0,所以它会在那一刻产生与dealloc相同的效果.
是对的吗?还是有更好的简短解释?
我从NSUserDefaults加载到对象的init方法中.我可以在对象的dealloc方法中保存到NSUserDefaults吗?
完全像:
-(void)dealloc {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
[userDefaults synchronize];
self.filenamesArray = nil;
self.defaultsKey = nil;
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
好,坏,好吗?如果它不好,哪里会更好.
编辑:
感谢您的详细回复.所有这些都是有道理的.我发现为什么这是一个保存到用户默认值的不好的地方的另一个原因是,只有当一个对象很好地解除分配时才会调用dealloc.如果我的应用程序被杀死,此代码永远不会运行.同样,如果将应用程序推入后台(iOS 4),则无法运行.我也删除了显式[userDefaults synchronize]调用.这让我有些紧张,但我相信苹果就是这个.:)
我有一个基于导航的视图控制器,在视图控制器中我隐藏了顶部导航栏并使用自定义UIView作为导航栏.
UIView栏有一个后退按钮,我使用Delegate方法(我已经声明了一个协议)在后退按钮被预设时与视图控制器通信.
我在CustomNavigation Bar id委托中使用委托;
并在主视图控制器中,当我分配导航栏时,我设置了委托
topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)];
topBar.lblTitle.text = @"Shop";
topBar.delegate = self;
Run Code Online (Sandbox Code Playgroud)
我在ViewControllers dealloc中发布了这个Bar.
现在,当我按下后退按钮时,我使用委托方法在主ViewController中调用popViewController.
//in Custom Bar
-(void)ButtonPressed {
[delegate TopNavigationBarBackButtonPressed];
}
//In View COntroller
-(void)TopNavigationBarBackButtonPressed {
[self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
现在ViewController是poped并且控件转到上一个viewController但是在ViewController和UIView中都没有触发dealloc
我究竟做错了什么?
我有一个对象字典,需要在它们发布之前进行清理.我有一个方法可以为整个字典执行此操作.在我用我的-dealloc方法发布字典之前,我想做同样的事情.但是,我不确定在释放期间对象的状态.例如,在C#或Java中,我永远不会在最终确定的对象上调用方法,但我不确定这是否适用于Objective C和deallocation.self在解除分配期间调用清理方法是否可以接受,还是应该在我的复制中复制该功能-dealloc?
我知道iOS中的内存管理很容易受到像我这样的新手的影响,但我希望在stackoverflow上有一个清晰的解释,这是我在其他地方找不到的.
所以,假装我有一个房产/ ivar
@property(nonatomic, retain) UIPopoverController *popOver;
Run Code Online (Sandbox Code Playgroud)
我正在分配这样的:
self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];
Run Code Online (Sandbox Code Playgroud)
现在,在我的dealloc和viewDidUnload方法中,我做了两个
// in viewDidUnload:
self.popOver = nil;
// in dealloc:
[popOver release];
Run Code Online (Sandbox Code Playgroud)
题:
提前感谢您的时间 - 我会继续阅读,认真记忆管理不能那么难以包围...
我花了一些时间来调试ARC和自定义dealloc函数的一个奇怪的问题.
NSOperation类的DataRequestDataRequest保持对我生成的操作的唯一引用,并在操作完成块中销毁.它总是被破坏(它dealloc总是被执行)dealloc.我只有一个NSLog调用.......问题是:
如果我在调试器中运行它,dealloc中的断点永远不会被命中,日志消息永远不会出现.主要是我以为操作漏了.
如果我在仪器中运行它,一切都很好,系统控制台打印消息,Allocations仪器报告从正确的堆栈快照中释放的操作,包括自定义dealloc.没有检测到泄漏.
我100%确定我使用相同的编译器设置进行调试和分析.
最后最令人困惑的事情:如果我创建了一个自定义版本[DataRequest dealloc]并且我付诸实践self.operation = nil;- 即使从调试器中也可以正常工作.
有没有人提示某些编译器链接器选项试图看到一些区别?这可能是Apple工具中的错误(我们所有人都在为我们自己的错误指责一条大鱼,对吧?)
......是的,我尝试过使用GDB和LLDB.结果是一样的 - 可能表明什么.
我试图创建一个简约的样本,但它只是工作(确实);)
谢谢
我正在尝试将块参数传递给a NSInvocation,但应用程序崩溃了.调用发出网络请求并调用成功或失败块.我认为问题是在网络请求完成之前会释放块.我设法让它与一些Block_copyhackery 一起工作,它没有使用Instruments报告任何泄漏.
问题: - 即使静态分析仪或仪器没有报告,泄漏是否可能存在? - 有没有更好的方法来"保留"该区块?
// Create the NSInvocation
NSMethodSignature *methodSignature = [target methodSignatureForSelector:selector];
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:methodSignature];
[invoc setTarget:target];
[invoc setSelector:selector];
// Create success and error blocks.
void (^successBlock)(id successResponse) = ^(id successResponse) {
// Some success code here ...
};
void (^errorBlock)(NSError *error) = ^(NSError *error) {
// Some failure code here ...
};
/*
Without the two Block_copy lines, the block gets dealloced too soon
and the app crashes with …Run Code Online (Sandbox Code Playgroud) 当观察对象到达时,如何取消注册观察者dealloced?
当观察到的对象被解除分配时,cocoa绑定如何处理这种情况?
通过使用手动KVO,我必须删除dealloc对象之前的观察(removeObserver)... Cocoa绑定如何处理这个(停止观察被观察对象的dealloc)?
我的项目是一个混合静态库,用于显示带有一些JS来控制逻辑的UIWebView.当我在iOS 8/iPhone 6上使用64位并运行demo时,内存将保持在30M或更高!
当我在仪器中使用生成时,增加的内存使用几乎全部来自webcore; 这是否意味着JS代码中存在泄漏?当我使用Safari直接运行类似的JS时,我找不到泄漏.
当我发布UIWebView时,内存仍然没有被释放; 我用仪器分配测试了.内存中还有一些webcore和(非对象),我可以做些什么来释放它们?
我在crashlytics中得到了一些崩溃报告,我完全不明白,这里是崩溃线程的崩溃日志:

我没有找到任何关于我的代码的提示,也不是可重现的或仅在特定设备上发生的事情.根据Crashlytics的说法,它不是RAM或磁盘空间的问题,所以我在这里真的很无奈.
有没有人对堆栈跟踪有一些提示?
dealloc ×10
ios ×2
iphone ×2
objective-c ×2
autorelease ×1
cocoa ×1
crashlytics ×1
debugging ×1
delegates ×1
instruments ×1
ios4 ×1
memory ×1
nsinvocation ×1
release ×1
synchronize ×1
uiview ×1
uiwebview ×1
xcode ×1