Objective-c指定类的布尔属性不起作用

时间:2015-09-01 00:13:05

标签: objective-c properties boolean setter getter-setter

我有一个UIImageView的子类,它有一些布尔属性,如下所示:我无法在代码中将isOccupied值设置为YES。

TimeSpan ts = mExpiryDate.Subtract(DateTime.Now);
return ts.Days;

这些TargetView中的每一个都存储在#import <UIKit/UIKit.h> @interface TargetView : UIImageView @property (strong, nonatomic) NSString* letter; @property (assign, nonatomic) BOOL isMatched; @property (assign) BOOL isOccupied; -(instancetype) initWithLetter:(NSString*) letter andSideLength:(float)sideLength; @end

当我执行以下

NSMutableArray* _targets;

下次运行代码时,targetView仍然评估为False。所以我无法将isOccupied值设置为TRUE,true或YES。

我按如下方式初始化targetView,并且所有targetViews最初设置为isOccupied为false

   for (TargetView* tv in _targets) {
        if (!tv.isOccupied) {
            tv.isOccupied = YES;
           //[tv setIsOccupied:YES]; <--- have also tried used this setter
            break;
        }
    }

}

将布尔值赋给targetView的代码是在控制器中运行的委托方法,而不是在targetView类本身内。这会导致问题吗?或者我是如何设置我的属性的?我已经尝试过,原子,非原子,......

编辑**

我更改了一些代码,以便在类初始化中使用-(instancetype)initWithLetter:(NSString *)letter andSideLength:(float)sideLength{ UIImage* img = [UIImage imageNamed:@"blank.png"]; self = [super initWithImage:img]; if (self != nil) { self.isMatched = NO; self.isOccupied = NO; float scale = sideLength/img.size.width; self.frame = CGRectMake(0, 0, img.size.width*scale, img.size.width*scale); _letter = @""; } return self; 而不是**_isOccupied**。现在它的工作原理。谁能解释为什么这有效?

1 个答案:

答案 0 :(得分:3)

您在初始化self.isOccupied期间设置了self

Self尚未完全初始化,您正在尝试使用它的属性。显然该物业尚未初始化。

属性self.isOccupied由名为_isOccupied的局部变量(“ivar”)备份。每次在self.isOccupied上存储内容时,iOS都会将值存储在_isOccupied

iOS将直接接受使用该iVar,因为它已经初始化。

BTW,Apple建议您在属性上使用“is”时使用以下语法:

@property (nonatomic, assign, getter=isOccupied) BOOL occupied;

然后您可以使用image.occupied = YES设置并[image isOccupied];来获取。

相关问题