3

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

我在 .h 中声明一个变量

    @interface RootViewController : UIViewController
    {
         NSMutableArray *objMutableArray;
    }
    @property (nonatomic,retain)   NSMutableArray *objMutableArray;

在 .m 文件中

    @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

4 回答 4

2

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

请告诉我我做对了,否则我必须释放“objMutableArray”对象。

当然,您必须发布它,因为您使用alloc. 但是你怎么做的不正确。您正在泄漏内存,因为在viewDidUnload方法中(我想应该是这样viewDidLoad,不是吗!?)您正在分配一个retain属性-您的对象将具有两个引用计数(一个是因为+ alloc,一个是因为(retain))。

现在,当您在 中释放它时- dealloc,它的引用计数仍然为 1,因此您的类不会释放其所有权,因此会发生内存泄漏。

解决方案:

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

_objMutableArray = [[NSMutableArray alloc] init];

// ...

[_objMutableArray release];

方法#2:

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

// ...

self.objMutableArray = nil;
于 2013-07-18T07:14:39.587 回答
0

浏览您的代码

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

- (void)viewDidLoad
{
     [super viewDidLoad];

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

}

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

利用

self.objMutableArray = [NSMutableArray array];

代替

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

3) 现在你的实际问题是,在 dealloc 中释放时

我想这个问题已经回答了

于 2013-07-18T07:14:01.037 回答
0

viewDidUnload这不应该吗viewDidLoad。既然你已经写@synthesize objMutableArray=_objMutableArray;了,那么从那里开始如果你想直接访问这个属性而不使用 setter 和 getter。您将不得不使用_objMutableArray. dealloc 中的那一行[_objMutableArray release];会将对象的保留计数减一,这样如果结果保留计数为 0,则该对象将被释放。

于 2013-07-18T07:15:00.817 回答
0

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

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

于 2015-06-17T10:25:53.097 回答