我有一个单例类,它会累积数据,直到数据写入我的数据库(如果你想知道为什么我用这种方式实现,请看这里).保存数据后,我想破坏单例.我怎么能在ARC中这样做?或者我是偏执狂,我是否需要销毁它?
*您可能会说这是此问题的副本,但此处接受的答案并不具体,无法提供帮助.它说"你可以声明你明确调用的方法/函数." 这个代码可能是什么样的?如果我无法在方法之外释放对象,我怎么可能在方法中将其拉出来?它还说" 最简单的方法是让一个静态C++类保存它,然后在它的析构函数中释放它." 我不懂C++,但是 - 你真的可以在你的应用程序代码中加入C++类吗?
我的单身实现如下:
+(NHCFamilyStatus *)familyStatus
{
static dispatch_once_t pred;
static NHCFamilyStatus *familyStatusSharedObject=nil;
dispatch_once(&pred, ^
{
familyStatusSharedObject = [[NHCFamilyStatus alloc] init];
});
return familyStatusSharedObject;
}
Run Code Online (Sandbox Code Playgroud) 我知道声明属性生成存取方法,这只是语法糖.
我发现self.property = nil他们的dealloc方法中有很多人使用它.
1)在Apple的内存管理文档中,p23它说:
您不应该使用访问器方法来设置实例变量的唯一地方是init方法和dealloc.
为什么不呢?
2)在Apple的Objective-C 2.0,p74中
声明的属性从根本上取代了访问器方法声明; 在合成属性时,编译器仅创建任何缺少的访问器方法.没有与
dealloc方法直接交互 - 不会自动为您释放属性.但是,声明的属性提供了一种交叉检查dealloc方法实现的有用 方法:您可以在头文件中查找所有属性声明,并确保未标记的对象属性assign被释放,并且标记的 对象属性不会assign被释放.注意:通常在
dealloc方法中,您应该release直接对象实例变量(而不是调用set访问器并nil作为参数传递),如下例所示:
- (void)dealloc { [property release]; [super dealloc]; }
Run Code Online (Sandbox Code Playgroud)
但是,如果使用现代运行时并合成实例变量,则无法直接访问实例变量,因此必须调用访问器方法:
- (void)dealloc { [self setProperty:nil]; [super dealloc]; }
Run Code Online (Sandbox Code Playgroud)
这个音符是什么意思?
我找到了[property release];并且[self setProperty:nil];都工作了.
@interface someview:UIView{
NSTimer* timer;
}
@end
@implementation someview
-(void)dealloc{
NSLog(@"dealloc someview");
[timer invalidate];
timer = nil;
}
-(void)runTimer{
//
}
-(void)someMethod{
timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
}
@end
Run Code Online (Sandbox Code Playgroud)
释放someview不会调用dealloc并且计时器继续运行.
如果我注释掉"timer = [NSTimer schedule ...."部分,将调用dealloc.这意味着我的代码的所有其他部分都正常工作,而计时器是罪魁祸首.runTimer方法是空的,这意味着它只是与我混淆的计时器.
我在工作中继承了一个iPhone应用程序,我是Objective-C的新手,所以我还没有我的方向.我遇到了类似这样的代码:
- (void) dealloc {
[[StaticObject sharedObject] showSomeDialog];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
我知道这在其他语言中是不受欢迎的.我的蜘蛛感觉很疯狂地看着那段代码.
这是一个常见的Objective-C成语吗?或者我有一个糟糕的代码库来解决?
我有一个小应用程序,它使用iPhone上的位置服务.一切都运作良好,除了事实,有时,即使我明确杀死应用程序,信息栏中的小箭头仍保持活动状态.我使用的背景模式locationservices,因此的appDelegate方法applicationWillResignActive,applicationDidEnterBackground,applicationWillEnterForeground和applicationDidBecomeActive正在实现,但不要触摸位置的服务(以及-我需要他们在后台模式下).
在那个配置applicationWillTerminate永远不会被调用; 我实现所有的清理清理的stopUpdatingLocation中dealloc,我没有找到适合这个任何其他地方.但仍然 - 指标仍然存在.
有任何想法吗?
在Objective-C中,我理解如果一个对象将自己设置为另一个对象的委托,它应该将该对象的委托设置nil在其中,dealloc以避免在消息过后发送消息.
但是,在使用Accessorizer(Xcode实用程序)时,它生成的存根代码也会delegate = nil在dealloc具有委托实例变量的类中添加.那是什么意思?
当我使用-addObserverForName: object: queue: usingBlock:了NSNotificationCenter在-viewDidLoad:我的视图控制器的方法,该-dealloc方法最终没有被调用.
(当我删除时-addObserverForName: object: queue: usingBlock:,-dealloc再次调用.)
使用-addObserver: selector: name: object:似乎没有这个问题.我究竟做错了什么?(我的项目是使用ARC.)
下面是我的实现示例,以防我在这里做错了:
[[NSNotificationCenter defaultCenter] addObserverForName:@"Update result"
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
updateResult = YES;
}];
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
我尝试添加以下内容(无济于事):
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController]) {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
}
Run Code Online (Sandbox Code Playgroud) 在Android中我有单例类,但我不确定垃圾收集器是否可以解除分配.
如果垃圾收集器将解除分配我的单例类,如何避免重新分配?
我有一个名为"cancelAllPendingDownloads"的各种地方调用的方法这是取消各种作业和更新内部计数器的一般方法.
在dealloc方法中调用时会出现问题
-(void)dealloc
{
[self cancelAllPendingDownloads]; // want to cancel some jobs
}
-(void)cancelAllPendingDownloads // updates some internals
{
__weak __typeof__(self) weakSelf = self; // This line gets a EXC_BAD_INSTRUCTION error in runtime
for(Download *dl in self.downloads)
{
dl.completionHandler = ^{ // want to replace the previous block
weakSelf.dlcounter--;
}
[dl cancel];
}
}
Run Code Online (Sandbox Code Playgroud)
不确定为什么它在dealloc方法中失败,因为"self"仍然存在
当我将代码更改为
__typeof__(self) strongSelf = self; //everything works fine
__weak __typeof__(self) weakSelf = strongSelf; (or "self") BAD_INSTRUCTION error
Run Code Online (Sandbox Code Playgroud)
错误发生在第二行
weak-references objective-c dealloc ios automatic-ref-counting
我想知道我是不是在某种程度上偶然发现了一个错误,刷卡删除UITableViewCells时不会释放它们UITableViewController.
我在自定义表格单元格中添加了一个-dealloc方法,该方法会记录一条消息.当我按下导航控制器时,所有6条消息都被注销.
如果我滑动删除一个(或更多),然后按回,则只记录5个.所以我注销了已被删除的单元格的指针地址,以供将来参考.现在当我回到任何时候暂停执行时,我可以进入lldb提示符:
po 140382950334240
<TableLeakCell: 0x7fe67852a490; baseClass = UITableViewCell; frame = (-375 176; 375 44); text = 'Chris'; hidden = YES; autoresize = W; gestureRecognizers = <NSArray: 0x7fe678530d70>; layer = <CALayer: 0x7fe67852a860>>
Run Code Online (Sandbox Code Playgroud)
这应该已经解除分配!该x.position小区是完全-(tableView.width)和hidden=YES.因为在动画完成后单元格仍然处于该位置.或者它可能正在排队等待重用?无论哪种方式,它都是永远存在的,Apple的文档中没有任何关于在调用deleteRowsAtIndexPaths之后必须手动销毁单元格的内容.
这里有快速的概念验证项目:https: //github.com/iOSDigital/UITableViewLeak
dealloc ×10
objective-c ×6
ios ×4
iphone ×2
singleton ×2
android ×1
delegates ×1
invalidation ×1
ios4 ×1
nstimer ×1
null ×1
properties ×1
uitableview ×1
uiview ×1
xcode ×1