我想在视图控制器的生命周期结束时执行一些清理,即删除NSNotificationCenter通知。 实现dealloc导致Swift编译器错误: Cannot override 'dealloc' which has been marked unavailable 在Swift的对象生命周期结束时执行一些清理的首选方法是什么?
我已经从几个来源(stackoverflow.com,cocoa-dev,文档,博客等)了解到,在init和dealloc方法中使用访问器和设置(foo,setFoo :)是“错误的”。 我明白,如果你这样做的话,有一个遥远的可能性混淆了观察财产的其他物体。 ( 这里给出一个简单的例子) 不过,我不得不说,我不同意这种做法,原因如下: 新的Objective-C运行时(iPhone上的那个和10.5中的64位运行时)允许您声明属性而不声明相应的ivar。 例如,下面的类将在10.5或iPhone(设备,而不是模拟器)上编译得很好: @interface Foo : NSObject { } @property (retain) id someObject; @end @implementation Foo @synthesize someObject; @end 理解上面是一个完全有效的Objective-C类,比方说,我决定编写一个初始化程序,并为了内存pipe理的目的,使用dealloc方法(因为GC在iPhone上不可用)。 我读过的关于初始化和释放的所有东西都会导致我写下面两个方法: – (id) init { if (self = [super init]) { //initialize the value of someObject to nil [self setSomeObject:nil]; } return self; } – (void) dealloc { //setting someObject […]
想知道是否有经验的人可以解释这一点。 我见过的例子… [view release]; view = nil; ….(void)dealloc中。 有什么区别,是另一个更好呢? 什么是最好的方法? 在进行retainCounttesting的时候,我个人看到nil从3降到0,但是release只是从3降到2。
int main(){ Employee *e = new Employee(); delete e; delete e; … delete e; return 0; }
在我的小iPad应用程序中,我有一个使用观察者的“切换语言”function。 每个视图控制器在其viewDidLoad:注册自己的观察者viewDidLoad: 。 – (void)viewDidLoad { [super viewDidLoad]; [observer registerObject:self]; } 当用户点击“更改语言”button时,新语言被存储在我的模型中,观察者被通知并且在其注册对象上调用updateUi:select器。 这工作得很好,除了当我在TabBarController视图控制器。 这是因为当标签栏加载时,它从它的子控制器中提取标签图标而不初始化视图,所以viewDidLoad:不被调用,所以这些视图控制器不会收到语言改变通知。 因此,我将registerObject:调用移动到init方法中。 当我使用viewDidLoad:回到我的观察者注册,我使用viewDidUnload:注销。 因为我现在正在init注册,所以在dealloc取消注册非常有意义。 但是,这是我的问题。 当我写: – (void) dealloc { [observer unregisterObject:self]; [super dealloc]; } 我得到这个错误: ARC禁止“dealloc”的显式消息发送 因为我需要调用[super dealloc]来确保超类正确地清理,但是ARC禁止,我现在被卡住了。 有什么方法可以在我的物体快要死的时候得到通知?
在我的init方法中使用点符号来初始化retain属性为零是不是一个好主意? 有了这样的普通财产: @property (nonatomic, retain) id foo; 说我在init方法中设置self.foo = nil 。 合成的方法首先释放或自动释放foo (不完全确定潜在的障碍)。 在第一次接电话或接电话之前, foo保证是零吗? 或者它会指向随机垃圾,除非我明确地设置foo = nil没有点符号?