我怎样才能让我的setter设置?

问题描述:

我试图为我的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 

,你应该重写,而不是制定者,吸气:

- (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

你制定者很可能设置得很好,但你@property声明意味着,该对象不保留。

假设ARC,weak@property的声明不会做你想要的;除非您有强烈引用对象的其他内容,否则ARC运行时将非常高兴地在退出该方法后释放它。

还请注意,以下是毫无意义的; if()测试和分配实际上是无操作的(并且在手动保留释放下将是泄漏)。

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