0

arrayWithCurrentLadder配列が少なくとも1回割り当てられて開始されるように、プロパティの遅延インスタンス化を実行しようとしています。ただし、配列内のオブジェクトを処理しようとしても何も起こらないため、セッターが実際に呼び出されることはないようです。そこで、配列内のNSLogオブジェクトを試して、実際の値を取得しているかどうかを確認することにしました。 (私はあなたが見ることができるようにそのコード行で星を付けました)そしてデバッガーは言っ(null)たので、私のセッターは実際には設定されていないと思います。セッターにランダムなNSLogsを追加して再度表示しましたが、メッセージがデバッガーに表示されませんでした。セッターがセットされないのはなぜですか?

#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
4

2 に答える 2

1

セッターの代わりにゲッターをオーバーライドする必要があります。

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

    return _arrayWithCurrentLadder;
}
于 2012-07-09T00:25:07.013 に答える
0

セッターは問題なく設定されている可能性がありますが、@property宣言はオブジェクトが保持されていないことを意味します。

ARC を仮定すると、その a の宣言はweak @propertyあなたが望むことをするつもりはありません。オブジェクトを強く参照するものが他にない限り、ARC ランタイムはそのメソッドの終了時にオブジェクトを喜んで解放します。

以下は意味がないことにも注意してください。その if() テストと代入は事実上ノーオペレーションです (そして、手動の保持リリースの下ではリークになります)。

if (!foo) foo = [[... alloc] init];
foo = somethingElse;
于 2012-07-09T03:34:05.897 に答える