Objective-c 分配 class 的布尔值 属性 无效
Objective-c assigning Boolean property of class not working
我有一个 UIImageView 的子class,它具有如下一些布尔属性:而且我无法在我的代码中将 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如下,所有的targetView初始设置为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 class 本身。这会导致问题吗?或者是我如何设置我的属性?我试过赋值,原子的,非原子的,......
编辑**
我更改了一些代码以在 class 初始化中使用 **_isOccupied**
而不是 **self.isOccupied**
。现在它起作用了。谁能解释为什么这有效?
您正在 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];
获取。
我有一个 UIImageView 的子class,它具有如下一些布尔属性:而且我无法在我的代码中将 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如下,所有的targetView初始设置为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 class 本身。这会导致问题吗?或者是我如何设置我的属性?我试过赋值,原子的,非原子的,......
编辑**
我更改了一些代码以在 class 初始化中使用 **_isOccupied**
而不是 **self.isOccupied**
。现在它起作用了。谁能解释为什么这有效?
您正在 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];
获取。