ios基页面视图控制器值分配

时间:2012-03-03 05:04:32

标签: ios subclassing

我正在使用基本视图控制器来处理其他一些视图控制器,

我将它作为基础,因为我有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];

这些标签的指针会被保存吗?如果我只是注释掉它看起来不好看,那么我会得到一个会崩溃的内存泄漏吗?

如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

正如理查德所说,你不应该调用其他对象的dealloc方法。如初。

如果保留titleStringjustifyTitleString /强大的属性,则下面的此版本可以使用。假设没有其他对象保留titleStringjustifyTitleString,则其保留计数将变为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],因为它会由编译器自动提供。