【问题标题】:Objective-C ivar BOOL not keeping valueObjective-C ivar BOOL 不保持价值
【发布时间】:2012-11-21 03:08:47
【问题描述】:

编辑 - 为错字道歉,我很着急,因为我不得不离开大楼,但是嗯......我可以问一下,为什么不赞成?仅仅因为一些语法错误?我愿意接受批评,但请保持建设性?

感谢建设性的回答,我都投了赞成票。

==============================================

我有一个 iVar BOOL,我想在整个课程中使用它。我试图将它初始化为YES,但我第一次读出来时,它是NO。这是为什么?这对我来说很奇怪,因为我的ints 都被保留了。

在我的 .mm 文件中,我有这样的内容:

@interface MyClass : NSObject {
    BOOL myBool;
    int myInt;
}

@end

@implementation MyClass

-(id)init{
    //...
    myInt = 3;
    myBool = YES; //here i set it
    //...
    [self addObjectsToGame];
    //...
}

-(void)addObjectsToGame{
    //...
    assert(myInt == 3);
    assert(myBool);    // <---- this line would fail
    //...
}

@end

我知道我可以将@property 与assign 一起使用,但为什么这个iVar 不能保留它的价值??

编辑

好的,是的,哇,这里真的有些乱了...我试图用@property 替换它,但它仍然无法正常工作。然后我尝试为变量myBool“在项目中查找所有内容”,我不会在其他任何地方更改它

注意:我正在使用 cocos2d,但我认为这不会影响任何事情

【问题讨论】:

  • 您确定在@implementation 之前没有错过第二个@end?
  • 我不认识声明 addObjectsToGame 的语法,方法名称后面有括号。而且您不会以[self addObjectsToGame] 的形式调用它。显然这不是标准的 Objective-C 文件。这是 Objective-C++ 吗?
  • 你能给我们真正的代码吗? -(void)addObjectsToGame() 无效 obj-c
  • 啊。你是对的,它不是 Objective-C 代码,我只是在编辑器中输入它,因为真正的代码真的很长。但这就是我所做的-我尝试对变量“myBool”使用XCode的“在项目中查找所有内容”,并且只有1个实例我正在积极更改它的值-在init ....和当我在init 之后转到NSLog("%@",myBool?@"true":@"false"); 时,输出会给我false...这就是我如此困惑的原因

标签: objective-c ios variables


【解决方案1】:

我已经为你修复了 Objective-C 语法,一切都按预期工作

#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
    BOOL myBool;
    int myInt;
}
-(void)addObjectsToGame;
@end

@implementation MyClass

-(id)init{
    if (self = [super init])
    {
        myInt = 3;
        myBool = YES; //here i set it
        [self addObjectsToGame];
    }
    return self;
}

-(void)addObjectsToGame{
    assert(myInt == 3);
    assert(myBool);
    NSLog(@"OK");
}

@end


int main(int argc, char *argv[]) {
    @autoreleasepool {
        [MyClass new];
    }
}

【讨论】:

    【解决方案2】:

    这个 iVar 将保留它的价值,只要你不做任何其他事情来搞砸它

    #import <Foundation/Foundation.h>
    
    @interface MyClass : NSObject {
        BOOL myBool;
        int myInt;
    }
    @end
    
    @implementation MyClass
    
    -(id)init{
        //...
        myInt = 3;
        myBool = YES; //here i set it
        //...
        [self addObjectsToGame];
        //...
        return self;
    }
    
    -(void)addObjectsToGame{
        //...
        assert(myInt == 3);
        assert(myBool);    // <---- this line would fail
        //...
        NSLog(@"didn't fail");
    }
    
    @end
    

    这段代码没有失败

    【讨论】:

      【解决方案3】:

      哇,我在 iOS 上真是个菜鸟 -

      所有BOOL 值都初始化为NO(而不是随机的),我不断得到NO 的原因是因为我在分配它之前一直在使用BOOL,而且我已经做到了non-atomic(尽管大多数时候这无关紧要)

      这才是真正的原因;但是,我会接受别人的回答,因为这是一个微不足道的错误

      【讨论】:

      • “而不是随机” - 这些是堆栈分配的 C 风格自动变量。实例变量在创建实例时由运行时清零。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2012-08-20
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多