gpt4 book ai didi

Objective-c 分配类的 boolean 属性不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:43 24 4
gpt4 key购买 nike

我有一个 UIImageView 的子类,它有一些 boolean 属性,如下所示:而且我不能在我的代码中将 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;

将 boolean 值分配给 targetView 的代码是在 Controller 中运行的委托(delegate)方法,而不是在 targetView 类本身中运行。这会导致问题吗?或者是我如何设置我的属性?我试过赋值,原子的,非原子的,......

编辑**

我更改了一些代码以在类初始化中使用 **_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];获取。

关于Objective-c 分配类的 boolean 属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com