【问题标题】:variable connected to Interface builder not free memory when release it , how to fixed?连接到接口生成器的变量在释放时未释放内存,如何修复?
【发布时间】:2011-08-18 14:01:36
【问题描述】:

当视图释放所有内存未空闲时,此视图控制器将消耗内存 如何释放内存??

@interface Agro01ViewController : UIViewController<UIScrollViewDelegate> {

    NSInteger picIndex;
    BOOL isOverrideing;
    NSTimer *myTimer;
    NSInteger maxPicture;
}

@property (nonatomic, retain) IBOutlet UIScrollView *myscrollView;
@property (nonatomic, retain) IBOutlet UIScrollView *myscrollView3;
@property (nonatomic, retain) IBOutlet UIView *simgView;
@property (nonatomic, retain) IBOutlet UIView *simgView3;
@property (nonatomic, retain) IBOutlet UIView *imgView;
@property (nonatomic, retain) IBOutlet UIView *imgView2;
@property (nonatomic, retain) IBOutlet UIView *imgView3;
@property (nonatomic, retain) IBOutlet UIView *imgView4;
@property (nonatomic, retain) IBOutlet UIView *imgView5;
@property (nonatomic, retain) IBOutlet UIView *imgView6;
@property (nonatomic, retain) IBOutlet UIView *imgView7;
@property (nonatomic, retain) IBOutlet UIView *imgView8;
@property (nonatomic, retain) IBOutlet UIView *Portrait;
@property (nonatomic, retain) IBOutlet UIView *Landscape;
@property (nonatomic) NSInteger maxPicture;

- (IBAction) Closebutton:(id)sender;
- (void)updatepicture;
- (IBAction) SecondViewbutton:(id)sender;
@end

@implementation Agro01ViewController
@synthesize imgView = _imgView, imgView2 = _imgView2, imgView3 = _imgView3, imgView4 = _imgView4, imgView5 = _imgView5;
@synthesize imgView6 = _imgView6, imgView7 = _imgView7, imgView8 = _imgView8, Portrait = _Portrait, Landscape = _Landscape ;
@synthesize myscrollView = _myscrollView, myscrollView3 = _myscrollView3, simgView = _simgView, simgView3 = _simgView3, maxPicture;
- (void)dealloc {
    NSLog(@"dealloc");
    [_Landscape release];
    [_Portrait release];
    [_imgView release];
    [_imgView2 release];
    [_imgView3 release];
    [_imgView4 release];
    [_imgView5 release];
    [_imgView6 release];
    [_imgView7 release];
    [_imgView8 release];
    [_myscrollView release];
    [_myscrollView3 release];
    [_simgView release];
    [_simgView3 release];
    [super dealloc];

}
- (void)viewDidUnload {
    self.simgView = nil;
    self.simgView3 = nil;
    self.myscrollView = nil;
    self.myscrollView3 = nil;
    self.Landscape = nil;
    self.Portrait = nil;
    self.imgView = nil;
    self.imgView2 = nil;
    self.imgView3 = nil;
    self.imgView4 = nil;
    self.imgView5 = nil;
    self.imgView6 = nil;
    self.imgView7 = nil;
    self.imgView8 = nil;
    [super viewDidUnload];

}

- (void)viewDidLoad {
    if (([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight)) {
        self.Landscape.alpha = 1;
        self.Portrait.alpha = 0;
    }
    else {
        self.Landscape.alpha = 0;
        self.Portrait.alpha = 1;
    }
    [self.view addSubview:self.Landscape];
    [self.view addSubview:self.Portrait];


    self.myscrollView3.contentSize = CGSizeMake(self.simgView3.frame.size.width, self.simgView3.frame.size.height);
    self.myscrollView3.maximumZoomScale = 1.0;
    self.myscrollView3.minimumZoomScale = 1.0;
    self.myscrollView3.clipsToBounds = YES;
    self.myscrollView3.delegate = self;
    self.myscrollView3.showsHorizontalScrollIndicator = NO;
    self.myscrollView3.showsVerticalScrollIndicator = NO;
    [self.myscrollView3 addSubview:self.simgView3];




    self.myscrollView.contentSize = CGSizeMake(self.simgView.frame.size.width, self.simgView.frame.size.height);
    self.myscrollView.maximumZoomScale = 1.0;
    self.myscrollView.minimumZoomScale = 1.0;
    self.myscrollView.clipsToBounds = YES;
    self.myscrollView.delegate = self;
    self.myscrollView.showsHorizontalScrollIndicator = NO;
    self.myscrollView.showsVerticalScrollIndicator = NO;
    [self.myscrollView addSubview:self.simgView];
    isOverrideing = NO;
    picIndex = 0;

    [super viewDidLoad];
}

【问题讨论】:

    标签: objective-c ios memory-management interface-builder


    【解决方案1】:

    摆脱:

    - (void)viewDidUnload {
    self.simgView = nil;
    self.simgView3 = nil;
    self.myscrollView = nil;
    self.myscrollView3 = nil;
    self.Landscape = nil;
    self.Portrait = nil;
    self.imgView = nil;
    self.imgView2 = nil;
    self.imgView3 = nil;
    self.imgView4 = nil;
    self.imgView5 = nil;
    self.imgView6 = nil;
    self.imgView7 = nil;
    self.imgView8 = nil;
    [super viewDidUnload];
    }
    

    在 dealloc 发生之前,您正在清除指向要删除的对象的指针。让dealloc来处理吧。

    【讨论】:

    • 谢谢。我删了,我测试一下
    • 如果这样可以解决问题,正确的解决方案是确保您的属性定义为retain。上面的代码是正确的,应该是viewDidUnload的一部分。
    • Joe ,内存仍然没有空闲。有什么解决办法吗?
    • Rob Napier,我已将其更改为保留,但我不知道为什么当此视图具有 dealloc 时内存不可用
    • 好的,我错过了您使用访问器来处理引用。所以 Rob 是正确的,将它们设置为 nil(使用访问器)将释放对象。但是,我不确定您接到这些电话的时间。这是在您的 ViewController 中,因此只有在释放 ViewController 时才会调用 dealloc。 viewDidUnload 将在您的视图被释放时被调用,并用于清理与已发布视图关联的任何属性。那么它是哪一个?发生了什么让你期望内存被释放?
    猜你喜欢
    • 2014-08-06
    • 2013-07-18
    • 1970-01-01
    • 2017-08-12
    • 2012-04-22
    • 2020-10-13
    • 2011-09-02
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多