2012-07-09 78 views
0

我試圖爲我的arrayWithCurrentLadder屬性做懶惰實例化,以便我的數組至少分配一次並啓動一次。但是,似乎我的setter從來沒有真正被調用過,因爲當我嘗試使用數組中的對象進行任何操作時,什麼都不會發生,因此我決定嘗試和數組中的對象來確定我是否正在獲取實際價值(我把這行代碼放在你看得見的星星),調試器表示(null),所以我假設我的setter沒有實際設置。我在我的setter中隨機添加了NSLog以再次查看,但消息甚至沒有顯示在調試器中。爲什麼我的二傳手無法設置?我怎樣才能讓我的setter設置?

#import "LViewController.h" 

@interface LViewController() 
    @property (nonatomic) BOOL firstLadder; 
    @property (nonatomic, weak) NSMutableArray *arrayWithCurrentLadder; 
    @property (weak, nonatomic) IBOutlet UIView *playingView;//connects playingView to LViewController 
@end 

@implementation LViewController 

    @synthesize playingView = _playingView; 
    @synthesize firstLadder = _firstLadder; 
    @synthesize arrayWithCurrentLadder = _arrayWithCurrentLadder; 

    -(void)setArrayWithCurrentLadder:(NSMutableArray *)arrayWithCurrentLadder { 
     if(!_arrayWithCurrentLadder) 
      _arrayWithCurrentLadder = [NSMutableArray arrayWithCapacity:10]; 

     NSLog(@"kgjfkjg"); 

     _arrayWithCurrentLadder = arrayWithCurrentLadder; 

     NSLog(@"dkfjdk"); 

    } 

    - (IBAction)buildLadder:(UIButton *)sender { 
     if (self.firstLadder) { 

     ******************************************************************************************* 
      NSLog(@"%@", [[self.arrayWithCurrentLadder lastObject] frame].origin.x); 
     *******************************************************************************************  

      if (sender.frame.origin.x == [[self.arrayWithCurrentLadder lastObject] frame].origin.x) { 
       sender.backgroundColor = [UIColor redColor]; 
       [self.arrayWithCurrentLadder addObject:sender]; 
      } 
     } 

    } 

    - (IBAction)startingLadder:(UIButton *)sender { 
     if (!self.firstLadder) { 
      [self.arrayWithCurrentLadder addObject:sender]; 
     } 

     sender.backgroundColor = [UIColor redColor]; 
     self.firstLadder = YES; 
    } 

@end 

回答

1

,你應該重寫,而不是制定者,吸氣:

- (NSMutableArray *)arrayWithCurrentLadder 
{ 
    if (nil == _arrayWithCurrentLadder) { 
     _arrayWithCurrentLadder = [[NSMutableArray arrayWithCapacity:10] retain]; 
    } 

    return _arrayWithCurrentLadder; 
} 
+0

這既不解決問題,也不與代碼解決一些其他問題...這通常是一個壞主意,懶初始化的吸氣劑是將與志願或其他任何螺釘預計一個「得到」不改變狀態。 – bbum 2012-07-09 03:30:45

+0

如有必要,可以添加kvo呼叫。 – AdrienBrault 2012-07-09 06:29:53

+0

@bbum:你可以擴展一下嗎?蘋果經常演示如何在getter中使用惰性init - 例如。在Xcode默認模板中的應用程序委託Core Data堆棧中。可以說它在語義上有點誤導,但是OTOH是減少init代碼中語句順序的錯誤傾向性的好方法。 – Cris 2012-07-09 07:25:54

0

你制定者很可能設置得很好,但你@property聲明意味着,該對象不保留。

假設ARC,weak@property的聲明不會做你想要的;除非您有強烈引用對象的其他內容,否則ARC運行時將非常高興地在退出該方法後釋放它。

還請注意,以下是毫無意義的; if()測試和分配實際上是無操作的(並且在手動保留釋放下將是泄漏)。

if (!foo) foo = [[... alloc] init]; 
foo = somethingElse;