概述
官方例子tabster,SubLevelViewController文件中的代码。
m文件中的内容如下
@interface SubLevelViewController ()
@property (nonatomic, retain) NSArray *dataArray;
@end
@implementation SubLevelViewController
@synthesize dataArray, modalViewController, currentSelectionTitle;
- (void)viewDidLoad
{
[super viewDidLoad];
self.hidesBottomBarWhenPushed = YES;
self.dataArray = [NSArray arrayWithObjects:@"Feature 1", @"Feature 2", nil];
NSLog(@"print viewDidLoad");
NSLog(@"self。dataArray retain count is:%d", [self.dataArray retainCount]);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"print numberOfRowsInSection");
NSLog(@"self。dataArray retain count is:%d", [self.dataArray retainCount]);
return [self.dataArray count];
}
2012-03-25 17:27:42.870 Tabster[3751:b903] print viewDidLoad
2012-03-25 17:27:42.893 Tabster[3751:b903] self。dataArray retain count is:2
2012-03-25 17:27:45.099 Tabster[3751:b903] print numberOfRowsInSection
2012-03-25 17:27:45.102 Tabster[3751:b903] self。dataArray retain count is:1
这是m文件中的release代码,只有这地方dataArray release了。但没有执行到它。
- (void)dealloc
{
[dataArray release];
[modalViewController release];
[currentSelectionTitle release];
[super dealloc];
}
为什么执行了numberOfRowsInSection方法后,dataArray的count就少了一个?
谁把dataArray release了呢?
----------------------------------------------------------------------------------------------------------------------------------------------------------
回答一
long(121382647) 13:23:16
arrayWithObjects 你这个是autorelease
long(121382647) 13:23:38
系统自动retain count减一
对公账户(1002836257) 13:24:04
执行到什么的时候,系统会自动减一呢?
long(121382647) 13:24:14
只要你传值的时候有retain就可以了
long(121382647) 13:24:45
官方文档解释是在其所在的runloop解释是进行retain count减一
long(121382647) 13:24:56
结束
对公账户(1002836257) 13:25:21
我知道加上retain就肯定没错,但不加retain,为什么就不可以?
对公账户(1002836257) 13:25:54
runloop在这个例子中,是指哪里呢?
long(121382647) 13:27:42
autorelease的变量在其他地方进行引用肯定要retain
long(121382647) 13:28:16
不然用的过程中经常会出现变量已经被释放
long(121382647) 13:28:47
runloop你可以自己上网查查资料,一句话说不清楚
对公账户(1002836257) 13:31:17
感谢
long(121382647) 13:33:43
回答二
xzgyb 发表于:03-25 发自: Web Page
在viewDidLoad中的
self.dataArray = [NSArray arrayWithObjects:@"Feature 1", @"Feature 2", nil];
[NSArray arrayWithObjects:@"Feature 1", @"Feature 2", nil];创建出来的对象是被放在autorelease pool中的.
在viewDidLoad走完,一次消息循环完毕,这个autorelease pool中的对象就会被release,所以等到
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
时,就是1了,
其实不一定是这个方法,你可以试下别的方法,比如button的点击事件,也一样是1
如果
self.dataArray = [[NSArray alloc] initWithObjects:@"Feature 1", @"Feature 2", nil];
这就是一直是2,当然这就有内存泄露了。
----------------------------------------------------------------------------------------------------------------------------------------------------------
我的提问
self.dataArray = [[NSArray alloc] initWithObjects:@"Feature 1", @"Feature 2", nil];
这就是一直是2,当然这就有内存泄露了。
请教:如果是这样写的话,dataArray是不是该release两次?
最后
以上就是大胆狗为你收集整理的【内存管理-问题实例】为什么执行了numberOfRowsInSection方法后,dataArray的retainCount就少了一个? 谁把它 release了?的全部内容,希望文章能够帮你解决【内存管理-问题实例】为什么执行了numberOfRowsInSection方法后,dataArray的retainCount就少了一个? 谁把它 release了?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复