Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我的子类是否导致内存泄漏?_Iphone_Objective C_Memory Management_Subclassing - Fatal编程技术网

Iphone 我的子类是否导致内存泄漏?

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

我正在对UINavigationController和UITableview进行子类化,出于某种原因,我的视图正在泄漏内存,尽管我已经实现了所有正确的方法和发布调用。当我使用本机类而不是子类时,一切正常,没有泄漏

编辑:

这是我的超类标题:

//
//  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: