我怎样才能让我的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;
}
答
你制定者很可能设置得很好,但你@property
声明意味着,该对象不保留。
假设ARC,weak
@property
的声明不会做你想要的;除非您有强烈引用对象的其他内容,否则ARC运行时将非常高兴地在退出该方法后释放它。
还请注意,以下是毫无意义的; if()测试和分配实际上是无操作的(并且在手动保留释放下将是泄漏)。
if (!foo) foo = [[... alloc] init];
foo = somethingElse;
这既不解决问题,也不与代码解决一些其他问题...这通常是一个坏主意,懒初始化的吸气剂是将与志愿或其他任何螺钉预计一个“得到”不改变状态。 – bbum 2012-07-09 03:30:45
如有必要,可以添加kvo呼叫。 – AdrienBrault 2012-07-09 06:29:53
@bbum:你可以扩展一下吗?苹果经常演示如何在getter中使用惰性init - 例如。在Xcode默认模板中的应用程序委托Core Data堆栈中。可以说它在语义上有点误导,但是OTOH是减少init代码中语句顺序的错误倾向性的好方法。 – Cris 2012-07-09 07:25:54