OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

iOS中内存管理的问题(创建一个对象后他的引用计数为什么是3)

chenyu
chenyu 发布于 2013年10月05日
无人欣赏。

在两个个viewController之间传递数据,FirstViewController有一个button,点击后跳转到SecondViewController,点击SecondViewController界面上的button,跳回第一个界面,并修改第一个界面中button上的文字。 目前程序能做出来,但是遇到了一些疑惑,就是程序运行起来后打印了FirstViewController界面对象的引用计数,打印出来为什么是3,在SecondViewController.h文件中使用retain定义了FirstViewController的属性,为什么在第二个界面打印第一个界面对象的引用计数依然是3. @tinyfool @kxdd2002 @清醒疯子 能给解答一下吗?或者告诉我在哪里可以找到有关于这方面的资料?多谢啦 代码地址:http://pan.baidu.com/s/1eMfNl

代码:第一个界面的.h和.m文件

#import 
#import "SecondViewController.h"
@interface ViewController : UIViewController
@property (retain, nonatomic) IBOutlet UIButton *button;
- (IBAction)myButton:(id)sender;
-(void)showNextPage;
-(void)changeButtonTitle:(NSString *)str;
@end

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
 [super viewDidLoad];
 //次数打印当前对象的引用计数为什么是3 ???????????????????????
 NSLog(@"self retaincount: %d",[self retainCount]);
}
- (void)didReceiveMemoryWarning
{
 [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.
}
- (void)dealloc {
 [_button release];
 [super dealloc];
}
- (IBAction)myButton:(id)sender {
 
 [self showNextPage];
}
-(void)showNextPage
{
 SecondViewController * secondController = [[SecondViewController alloc]init];
 secondController.first = self;
 [self presentViewController:secondController animated:YES completion:nil];
}
-(void)changeButtonTitle:(NSString *)str
{
 NSLog(@"buttonTitle: %@",str);
 self.button.titleLabel.text = str;
}
@end

第二个界面的.h和.m


#import 
@class ViewController;
@interface SecondViewController : UIViewController
//此处使用retain好还是用assign好 ???????????????????????
@property (nonatomic,retain)ViewController * first;
- (IBAction)back:(id)sender;
@end

#import "SecondViewController.h"
#import "ViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 if (self) {
 // Custom initialization
 }
 return self;
}
- (void)viewDidLoad
{
 [super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
 [super didReceiveMemoryWarning];
}
- (IBAction)back:(id)sender
{
 //在.h文件中声明first的时候用了retain,此处打印first的引用计数为什么还是3,不应该是4吗??????????????????????? 
 NSLog(@"first retaincount: %d",[self.first retainCount]);
 [self.first changeButtonTitle:@"frist"];
 [self dismissViewControllerAnimated:YES completion:nil];
 
}
@end
共4条回复
楼长 ·
tinyfool 回复于 2013年10月05日

@sycx 老师接客

2楼 ·
sycx 回复于 2013年10月05日

你应该看看文档,读取retainCount的值没啥意义,framework本身会按需要retain你的object,你很难保证它们什么会retain以及会retain几次;

你的代码里:

  1. viewDidLoad时retainCount为什么是3 -> framework retain了
  2. back:时为什么还是3 -> framework 刚巧release 了一次
  3. SecondViewController里,firstassign比较好

PS: 如果你真的很有兴趣知道retainCount为什么是3, 你可以重载retain函数,然后下个断点看看

3楼 ·
chenyu 回复于 2013年10月05日

2楼 @sycx 很满意,五星..................

4楼 ·
phoenix5980 回复于 2013年10月05日

2楼 @sycx 老师已经是超神的节奏了么(。ÒᄉÓ)ノ

登录 或者 注册

AltStyle によって変換されたページ (->オリジナル) /