我正在使用基本视图控制器来处理其他一些视图控制器,
我将它作为基础,因为我有4到6个其他视图控制器将显示相同的标签和图像......
所以我尝试将这个基页和subClass设为其他ViewControllers,
我的疑问是,如果我将dealloc留给包含标签和其他字符串值的字符串,当为该页面调用dealloc时,我会得到一个异常
释放的指针未分配
但我不想仅仅为标签注释deallocs,
那么我做错了什么,不见了?
这里是BasePage
#import "BasePage.h"
@implementation BasePage
@synthesize titleString = _titleString;
@synthesize justifyTitleString = _justifyTitleString;
- (void) dealloc {
[_titleString dealloc];
[_justifyTitleString dealloc];
[super dealloc];
}
- (id)initWithParams:(NSString *)title :(NSString *)justifyTitle
{
self = [super init];
if (self) {
self.titleString = title;
self.justifyTitleString = justifyTitle;
}
return self;
}
我的应用使用导航控制器, 所以当我打电话给我使用的页面时:
CentresVC *centresVC = [[[CentresVC alloc]initWithParams:[NSString stringWithFormat:@"Centre %d", indexPath.row]:@"center"]autorelease];
[self.navigationController pushViewController:centresVC animated:YES];
在导航回来时弹出视图,
[_titleString dealloc]; [_justifyTitleString dealloc];
这些标签的指针会被保存吗?如果我只是注释掉它看起来不好看,那么我会得到一个会崩溃的内存泄漏吗?
如何解决这个问题?
谢谢!
答案 0 :(得分:1)
正如理查德所说,你不应该调用其他对象的dealloc
方法。如初。
如果保留titleString
和justifyTitleString
/强大的属性,则下面的此版本可以使用。假设没有其他对象保留titleString
和justifyTitleString
,则其保留计数将变为0,并且将自动调用其dealloc
方法。
- (void) dealloc {
[_titleString release];
[_justifyTitleString release];
[super dealloc];
}
下一个选项也可以使用,因为强大/保留属性的合成setter会在分配新属性之前将release
发送到属性的旧值。此外,如果您覆盖了您的setter以对旧值进行额外清理,那么这将是首选。
- (void) dealloc {
self.titleString = nil;
self.justifyTitleString = nil;
[super dealloc];
}
最后,如果您使用ARC,并且您不需要像上面第二种情况那样需要额外的清理,则根本不需要覆盖dealloc
。但是如果你确实需要覆盖dealloc
,那么你将省略[super dealloc]
,因为它会由编译器自动提供。