【问题标题】:Objective-c assigning Boolean property of class not workingObjective-c分配类的布尔属性不起作用
【发布时间】:2015-11-26 02:32:04
【问题描述】:

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

#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

这些 TargetView 中的每一个都存储在NSMutableArray* _targets;

当我执行以下操作时

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

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

我如下初始化targetView,所有targetViews初始设置为isOccupied为false

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

}

将布尔值分配给 targetView 的代码是在控制器中运行的委托方法,而不是在 targetView 类本身中。这会导致问题吗?或者是我如何设置我的属性?我试过assign,atomic,nonatomic,......

编辑**

我更改了一些代码以在类初始化中使用**_isOccupied** 而不是**self.isOccupied**。现在它可以工作了。谁能解释为什么这有效?

【问题讨论】:

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


【解决方案1】:

你在self的初始化过程中设置了self.isOccupied

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

属性self.isOccupied 由名为_isOccupied 的局部变量(“ivar”)支持。每次您在 self.isOccupied 上存储一些东西时,iOS 都会将值存储在 _isOccupied 上。

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

顺便说一句,Apple 建议您在属性上使用“is”时使用以下语法:

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

那么你可以使用image.occupied = YES来设置,[image isOccupied];来获取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2013-01-02
    • 2012-03-03
    • 2019-05-30
    相关资源
    最近更新 更多