簡體   English   中英

Objective-C自定義設置器

[英]Objective-C Custom Setter

注意:我沒有使用ARC

我有一個具有以下屬性的UILabel: @property (nonatomic, retain) UILabel *someLabel; 我正在嘗試設置自定義設置器。 將下面的代碼會導致泄漏,因為@property實際上是調用retain呢?

- (void)setSomeLabel:(UILabel *)someLabel
{
    if (someLabel != self.someLabel) {
        [self.someLabel release];
        self.someLabel = [someLabel retain];
    }

    // some custom code here
}

注意:我沒有使用ARC

你真的,真的應該。


您的二傳手是一個無限循環。 self.someLabel = ...的調用與[self setSomeLabel:...]的完全等效,導致循環。

正確的手動設置器如下所示:

- (void)setSomeLabel:(UILabel *)someLabel
{
  [someLabel retain];
  [_someLabel release];
  _someLabel = someLabel;

  // some custom code here
}

還有其他常見的模式。 一個主要的問題是,如果將對象重置為相同的值,是否應該運行“某些自定義代碼”。 如果不是,則此模式更有意義:

- (void)setSomeLabel:(UILabel *)someLabel
{
  if (someLabel != _someLabel) {
    [_someLabel release];
    _someLabel = [someLabel retain];

    // some custom code here
  }
}

該代碼將導致您的應用進入無限循環,就像使用self.someLabel導致調用方法setSomeLabel:

您可以嘗試使用以下代碼創建自定義設置器:

 @synthesize someLabel = _someLabel;
 - (void)setSomeLabel:(UILabel *)someLabel
 {
      if (someLabel != _someLabel)
      {
           [_someLabel release];
           _someLabel = [someLabel retain];
      }

      // custom code
 }

 - (void)dealloc
 { 
     [_someLabel release];
     // ... other releases
     [super dealloc];
 }

不,這很好,因為您在此處使用自定義設置器。

@Property等同於聲明訪問器方法。

僅當未實現setter和/或getter時,@ Synthesize才會基於屬性聲明屬性生成訪問器方法。

我假設您沒有使用ARC ...

您正確地保留了傳入的someLabel,而且在屬性上調用release也不是一件好事!

我將使用實例變量而不是屬性:

- (void)setSomeLabel:(UILabel *)someLabel
{
    if (someLabel != _someLabel) {
        [_someLabel release];
        _someLabel = [someLabel retain];
    }

    // some custom code here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM