1

我在文件中定义了一个对象:

@property (nonatomic, retain) UIBarButtonItem *printButton;

实现文件中:

@synthesize printButton;

self.printButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)];
[self.view addSubview:printButton];
[printButton release]; // Should I release it here?

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

我的问题是,我是否应该总是 release/autorelease在它之后对象(声明为保留属性addSubview,并且即使我要在其他函数中使用它,也要在 dealloc 中释放它?!

4

3 回答 3

4

当您拥有propertyasretain时,它会保留新值并将release消息发送到旧值。您还必须releasedealloc.

正确的方法是这样做:

self.printButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)] autorelease];

也是self.view addSubView保留子视图,超级视图负责释放它。

于 2013-03-23T19:26:55.613 回答
3

为了被保留,对象需要至少保留一次。不止一次是可以接受的,但关键是至少一次。通过保留,您是在说:“我需要它可用”,而通过释放,您是在说“我不再需要它”。比你需要的时间保留更长时间的东西是粗鲁和浪费的,比如说,在你被释放之后。这样做是泄漏。

对于您的具体问题:如果您的财产被保留,那么是的,您必须在某个时候释放。在你dealloc是一个好的时间,或者在它被你拥有的东西再次保留之后是一个更好的时间。将视图添加到子视图就是将对象添加到保留数组(您的UIView超类保留子视图数组)。数组本身保留了它的元素。因此,在您添加后立即发布是好的。

此外,由于您知道您的子视图数组并且它的内容将在您的一生中保留,因此根本不保留您的副本会更干净。这就是为什么子视图出口通常被声明为弱的原因。所以我会做以下事情:

@property(nonatomic, weak) UIBarButtonItem *printButton;

然后在初始化:

UIBarButtonItem *aPrintButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(printWebPage:)];
// this is just a stack variable, retained because of the alloc
[self.view addSubview:aPrintButton];  // this provides a second retain
self.printButton = aPrintButton;      // this does not retain because it's setter is declared weak
[aPrintButton release]; // release here subtracts one retain, leaving the one you need

您的子类不需要更明确的发布,因为UIView将负责释放它的子视图数组并将NSArray负责释放它的元素。

于 2013-03-23T19:41:31.170 回答
2

当您不再需要它们时,您应该释放您的对象(当然,如果不使用 ARC)。在您的情况下,一旦添加了视图,您就不再需要对它的引用(除非您打算在您的类中使用它,在这种情况下不要释放它)。

正如@AndrewMadsen 在评论中提到的,您释放了一个您拥有引用的对象(通过显式保留它们或使用newcopymutableCopyalloc方法获取引用)。

你可以在这里找到更多信息

于 2013-03-23T19:05:53.357 回答