【问题标题】:Memory issue with iphone app developmentiphone应用程序开发的内存问题
【发布时间】:2012-08-30 20:54:45
【问题描述】:

我正在开发一个 iphone 应用程序,它使用非常简单的界面并在后端进行数据库处理。我也在启用 ARC OPTION。 我的 viewDidLoad 方法如下:

    - (void)viewDidLoad
   {
    [super viewDidLoad];
// Do any additional setup after loading the view from its nib.

/*********needed to implement scroll view********/
svScroll.frame = CGRectMake(0, 0, 320, 460);
svScroll.contentSize = CGSizeMake(320, 800);
/*********************************************/

//[DataHelper openDbCompany];

NSString *date=[DataHelper getFinYr];

[btDate setTitle:[DataHelper dateSqliteToNormal:date] forState:UIControlStateNormal];

arrayUnitsMeasure=[[NSMutableArray alloc]initWithArray:[DataHelper getUnitsOfMeasure]];

//[DataHelper closeDbCompany];

tfValue.keyboardType=UIKeyboardTypeDecimalPad;
tfQuantity.keyboardType=UIKeyboardTypeDecimalPad;
tfCostUnit.keyboardType=UIKeyboardTypeDecimalPad;

//catching the notification for text field value change.
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:tfQuantity];

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:tfCostUnit];

    }

我的 .h 文件包含定义如下的 IBOutlets:

    @interface
     Create_Inventory_Item:UIViewController<Date_Picker_Protocol,Picker_View_Protocol,UITextFieldDelegate>
    {
        IBOutlet UIScrollView *svScroll;
        IBOutlet UITextField *tfItemName;

IBOutlet UILabel *lbUnitsOfMeasure;
IBOutlet UIButton *btSelectUnitsMeasure;

IBOutlet UIButton *btDate;
IBOutlet UINavigationBar *btBack;

IBOutlet UITextField *tfQuantity;
IBOutlet UITextField *tfCostUnit;
IBOutlet UITextField *tfValue;

IBOutlet UIButton *btCreate;
NSMutableArray *arrayUnitsMeasure;

UIButton *btKeyboardDone;
UIView *accessoryView;
UITextField *txtActiveField;
UIButton *btMinus;
Picker_View *callPickerView;
Date_Picker *callDatePicker;
    }

    @property(nonatomic,retain) UIButton *btMinus;
    @property(nonatomic,retain)UITextField *txtActiveField;
    @property(nonatomic,retain) UIButton *btKeyboardDone;
    @property(nonatomic,retain)UIView *accessoryView;
    @property(nonatomic,retain) IBOutlet UINavigationBar *btBack;
    @property(nonatomic,retain)IBOutlet UIScrollView *svScroll;
    @property(nonatomic,retain)IBOutlet UITextField *tfItemName;
    @property(nonatomic,retain)IBOutlet UILabel *lbUnitsOfMeasure;
    @property(nonatomic,retain)IBOutlet UIButton *btSelectUnitsMeasure;
    @property(nonatomic,retain) IBOutlet UIButton *btDate;
    @property(nonatomic,retain) IBOutlet UITextField *tfQuantity;
    @property(nonatomic,retain) IBOutlet UITextField *tfCostUnit;
    @property(nonatomic,retain)IBOutlet UITextField *tfValue;
    @property(nonatomic,retain) IBOutlet UIButton *btCreate;

    -(IBAction)btSelectUnitsMeasure:(id)sender;
    -(IBAction)btDate:(id)sender;
    -(IBAction)btCreate:(id)sender;
    -(IBAction) hideKeyboard:(id)sender;
    -(IBAction)showAlerView:(NSString *)message;
    -(IBAction)btBack:(id)sender;

请告诉我在dealloc和viewDidUnloadMethod中我需要做什么? 我正在使用 ARC OPTION。
此外,当我在模拟器中使用配置文件选项运行应用程序以进行内存分配和泄漏时,有时会显示 MEMORY LEVEL LOW WARNING 和 MEMORY LEVEL NORMAL。这是什么原因?

【问题讨论】:

    标签: iphone xcode memory dealloc viewdidunload


    【解决方案1】:

    如果您使用 ARC,您只需要一个使该类实例中所有基于对象的成员无效的 dealloc。

    所有应用都会偶尔收到内存警告。您可以选择通过取消可以稍后延迟初始化的成员来响应。

    在我的应用程序中,我在 viewWillAppear 中延迟初始化大多数可视成员(UIViews 等...),并在 viewDidDisappear 方法中积极释放。这样,只有 2 个视图可以同时初始化其成员(在视图控制器转换期间),并且当该视图是唯一可见的视图时,只有 1 个视图。

    因此,我收到的内存警告很少,除了在处理大图像等时。

    【讨论】:

    • 我需要在dealloc方法中调用[super dealloc]吗??
    • 如果您使用 ARC,则不需要。
    • “激进发布”是什么意思?我如何在 ARC 中发布?请解释?另外,ARC 中的所有对象都应该设置为 nil 吗?请查看代码 sn-p 并告诉我对象名称。
    • 积极意味着提前发布。在 ARC 中,尽早设置对您可能不需要“nil”的对象的引用。如果您及时延迟初始化事物,那么您也可以负担得起尽早发布事物。这可以让您的应用满足内存需求。
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多