【内存管理-问题实例】为什么执行了numberOfRowsInSection方法后,dataArray的retainCount就少了一个? 谁把它 release了?

官方例子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两次?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值