如何在iOS中管理内存管理

时间:2013-07-18 07:04:50

标签: iphone ios memory-management

我需要澄清内存管理概念。

我在.h

中声明了一个变量
    @interface RootViewController : UIViewController
    {
         NSMutableArray *objMutableArray;
    }
    @property (nonatomic,retain)   NSMutableArray *objMutableArray;
<。>文件中的

    @implementation RootViewController

    @synthesize objMutableArray=_objMutableArray;

    - (void)viewDidload
    {
         [super viewDidload];

         self.objMutableArray=[[NSMutableArray alloc]init];

        [self.objMutableArray addObject:@"FirstRow"];
        [self.objMutableArray addObject:@"SecondRow"];
        [self.objMutableArray addObject:@"ThirdRow"];
        [self.objMutableArray addObject:@"FourthRow"];
        [self.objMutableArray addObject:@"FifthRow"];
    }

我在所有地方都使用了self.objMutableArray。但是当我为该实例释放内存时,我使用了_objMutableArray。

    - (void)dealloc
    {
         [_objMutableArray release];
         [super dealloc];
    }

实际上我在为该实例释放内存时感到困惑。请告诉我我做的正确或我必须发布“objMutableArray”对象。

4 个答案:

答案 0 :(得分:2)

您似乎使用的是手动内存管理,而不是ARC。这很好,但你弄错了。

  

请告诉我我做对了或者我必须发布“objMutableArray”对象。

当然,您必须释放它,因为您使用alloc创建了它。但你怎么做是不正确的。您正在泄漏内存,因为在viewDidUnload方法中(我认为应该是viewDidLoad而不是它!!)您正在分配给retain属性 - 您的对象将具有引用计数为2(一个是因为+ alloc,一个是因为(retain))。

现在当你在- dealloc中发布它时,它仍然会有一个引用计数,所以你的类不会处置它的所有权,因此内存泄漏。

<强>解决方案:

您可以使用属性或实例变量。不要混淆两者。方法#1:

_objMutableArray = [[NSMutableArray alloc] init];

// ...

[_objMutableArray release];

方法#2:

self.objMutableArray = [[[NSMutableArray alloc] init] autorelease];

// ...

self.objMutableArray = nil;

答案 1 :(得分:0)

完成代码

1)您的意思是viewDidLoad而不是viewDidUnload

- (void)viewDidLoad
{
     [super viewDidLoad];

     self.objMutableArray=[[NSMutableArray alloc]init];
     ......
     ......

}

2)您不需要分配/ init,因为您保留了数组

使用

self.objMutableArray = [NSMutableArray array];

而不是

self.objMutableArray=[[NSMutableArray alloc]init];

3)现在你的实际问题,在dealloc

发布时

我认为这个问题是already answered

答案 2 :(得分:0)

viewDidUnload不应该是viewDidLoad。由于您已经编写了@synthesize objMutableArray=_objMutableArray;,因此如果您想直接访问此属性而不使用setter和getter。您必须使用_objMutableArray。 dealloc [_objMutableArray release];中的那一行会将对象保留计数减少一个,这样如果结果保留计数为0,则该对象将被释放。

答案 3 :(得分:0)

您可以阅读本文以更好地理解内存管理。

http://www.knowstack.com/objective-c-memory-management/