Iphone 我的子类是否导致内存泄漏?
我正在对UINavigationController和UITableview进行子类化,出于某种原因,我的视图正在泄漏内存,尽管我已经实现了所有正确的方法和发布调用。当我使用本机类而不是子类时,一切正常,没有泄漏 编辑: 这是我的超类标题:Iphone 我的子类是否导致内存泄漏?,iphone,objective-c,memory-management,subclassing,Iphone,Objective C,Memory Management,Subclassing,我正在对UINavigationController和UITableview进行子类化,出于某种原因,我的视图正在泄漏内存,尽管我已经实现了所有正确的方法和发布调用。当我使用本机类而不是子类时,一切正常,没有泄漏 编辑: 这是我的超类标题: // // MBAbstractViewController.h // GabbaiHD // // Created by Moshe Berman on 11/24/10. // Copyright 2010 MosheBerman.com. Al
//
// MBAbstractViewController.h
// GabbaiHD
//
// Created by Moshe Berman on 11/24/10.
// Copyright 2010 MosheBerman.com. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MBAbstractViewController : UIViewController {
IBOutlet UIImageView *backgroundImageView;
NSString *announcementText;
}
@property (nonatomic, retain) NSString *type;
@property (nonatomic, retain) NSDictionary *options;
@property (nonatomic, retain) NSString *announcementText;
-(void) setAnnouncementText:(NSString *)text;
@end
//
// MBAnnouncementViewController.h
// GabbaiHD
//
// Created by Moshe Berman on 11/24/10.
// Copyright 2010 MosheBerman.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "MBAbstractViewController.h"
@interface MBAnnouncementViewController : MBAbstractViewController {
IBOutlet UILabel *announcement;
}
- (void) setAnnouncementText:(NSString *)text withSize:(CGFloat)size;
@end
下面是我的子类标题:
//
// MBAbstractViewController.h
// GabbaiHD
//
// Created by Moshe Berman on 11/24/10.
// Copyright 2010 MosheBerman.com. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MBAbstractViewController : UIViewController {
IBOutlet UIImageView *backgroundImageView;
NSString *announcementText;
}
@property (nonatomic, retain) NSString *type;
@property (nonatomic, retain) NSDictionary *options;
@property (nonatomic, retain) NSString *announcementText;
-(void) setAnnouncementText:(NSString *)text;
@end
//
// MBAnnouncementViewController.h
// GabbaiHD
//
// Created by Moshe Berman on 11/24/10.
// Copyright 2010 MosheBerman.com. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "MBAbstractViewController.h"
@interface MBAnnouncementViewController : MBAbstractViewController {
IBOutlet UILabel *announcement;
}
- (void) setAnnouncementText:(NSString *)text withSize:(CGFloat)size;
@end
是什么导致子类内存泄漏?我错过什么了吗?(有。)根据
。。。如果视图控制器包含
出口(属性或原始变量)
包含IBOutlet关键字的),
您应该使用viewDidUnload
放弃所有权的方法
这些渠道或任何其他渠道
查看不再需要的相关数据
需要
尝试在viewDidUnload
中释放announcement
,因为它是一个IBOutlet,Interface Builder会保留它
- (void)viewDidUnload {
[super viewDidUnload];
[announcement release];
announcement = nil;
}
根据
。。。如果视图控制器包含
出口(属性或原始变量)
包含IBOutlet关键字的),
您应该使用viewDidUnload
放弃所有权的方法
这些渠道或任何其他渠道
查看不再需要的相关数据
需要
尝试在viewDidUnload
中释放announcement
,因为它是一个IBOutlet,Interface Builder会保留它
- (void)viewDidUnload {
[super viewDidUnload];
[announcement release];
announcement = nil;
}
在你的第二节课上,“公告”代表什么?这是一个IBOutlet(我没有看到它的合成)?如果它是一个属性或IBOutlet,您需要确保在您的dealloc中发布它。在您的第二节课中,“公告”代表什么?这是一个IBOutlet(我没有看到它的合成)?如果它是一个属性或IBOutlet,您需要确保在dealloc中释放它。在您的子类中,我注意到您有一个“announcement”变量,它似乎没有显示在您的超类中 我假设您的超类具有以下变量:
type
options
announcementText
虽然您的子类还有一个附加变量:
announcement
在子类的dealoc中,您发布了
announcementText
(它也在超类中发布),而不是announcement
,这可能是导致泄漏的原因。在子类中,我注意到您有一个“announcement”变量,它似乎没有显示在超类中
我假设您的超类具有以下变量:
type
options
announcementText
虽然您的子类还有一个附加变量:
announcement
在子类的解除锁定中,您释放了
announcementText
(也在超类中释放),而不是announcement
,这可能是导致泄漏的原因。您不应该以这种方式分配UIColor
:
[[UIColor alloc] colorWithAlphaComponent:0.0];
您在未初始化实例的情况下分配了实例,然后调用了工厂方法并丢失了对所分配实例的引用
在调用colorWithAlphaComponent:
之前,您需要调用其中一个初始值设定项。如果你不这样做,我不知道你会有什么样的行为。为什么不干脆[UIColor clearColor]代码>
您在使用UIFont
时也犯了同样的错误:
UIFont *font = [[UIFont alloc] fontWithSize:size];
你不应该这样做。您链接到+alloc
的唯一方法应该是初始值设定项(它总是返回所有已分配的内容)。你在这里泄密,我敢说你也有一些奇怪的意外行为
此外,正如David Liu所说,您似乎过度发布了announcementText
,而发布不足announcement
,这将导致崩溃和泄漏,具体取决于您的运气
编辑|根据显示头文件的更新,还存在其他问题(与泄漏无关)
永远不要保留NSString*
;相反,你应该复制它
@property (nonatomic, copy) NSString *announcementText;
这是因为NSString*
实际上可能是一个可变字符串,以后可能会更改。但是,如果您特别需要,可以使用retain
当您拥有@属性时,也不需要明确声明-setAnnouncementText:
在子类setAnnouncementText:with:
中,实际上对announcementText
ivar没有任何作用,我想这会让人困惑。您需要发布公告
ivar,并解决UIColor
和UIFont
使用不正确(泄漏)的问题。您不应以这种方式分配UIColor
:
[[UIColor alloc] colorWithAlphaComponent:0.0];
您在未初始化实例的情况下分配了实例,然后调用了工厂方法并丢失了对所分配实例的引用
在调用colorWithAlphaComponent:
之前,您需要调用其中一个初始值设定项。如果你不这样做,我不知道你会有什么样的行为。为什么不干脆[UIColor clearColor]代码>
您在使用UIFont
时也犯了同样的错误:
UIFont *font = [[UIFont alloc] fontWithSize:size];
你不应该这样做。您链接到+alloc
的唯一方法应该是初始值设定项(它总是返回所有已分配的内容)。你在这里泄密,我敢说你也有一些奇怪的意外行为
此外,正如David Liu所说,您似乎过度发布了announcementText
,而发布不足announcement
,这将导致崩溃和泄漏,具体取决于您的运气
编辑|根据显示头文件的更新,还存在其他问题(与泄漏无关)
永远不要保留NSString*
;相反,你应该复制它
@property (nonatomic, copy) NSString *announcementText;
这是因为NSString*
实际上可能是一个可变字符串,以后可能会更改。但是,如果您特别需要,可以使用retain
当您拥有@p时,也不需要明确声明-setAnnouncementText: