【问题标题】:Ivar showing null although it's strongly referenced and initialized and allocatedIvar 显示为 null,尽管它被强引用、初始化和分配
【发布时间】:2013-07-23 02:40:25
【问题描述】:

我有一个名为 A 的类,它有一个名为 NSMutableArray 类型的行的公共 ivar。我在 init 方法中分配和初始化 ivar。另一方面,我有另一个名为 B 的类,它强烈引用 A 类的 ivar。我在 B 类的 init 方法中分配和初始化 A 类。我期望的是:

在类 B 分配并初始化类 A 作为其实例变量后,类 A 的公共 ivar 不应为空。我得到了什么:

当我执行以下操作时,我发现 A 类变量的 lines 变量为空:

   myClassAVariable=[[ClassA alloc]init ];
   NSLog(@"The lines object is %@",[myClassAVariable lines]);

注意:我使用的是 cocos2d。

编辑:

这是 ClassA.h 文件的一部分;

@interface ClassA : CCLayer 
{
    NSMutableArray *lines;
}
@property(strong,nonatomic)NSMutableArray *lines;

下面是 ClassA 的 init 方法部分:

if( (self=[super init]) ) {
   lines=[[NSMutableArray alloc] init];
}
return self;

这是ClassB的接口部分:

 @interface ClassB : CCLayer
 {
       DrawLayer *draw;
 }
 @property(strong,nonatomic)DrawLayer* draw;

最后,这是 ClassB 的初始化:

if( (self=[super init]) ) {
   draw=[[DrawLayer alloc] init];
        CCLOG(@"Lines object is %@",[draw lines]);//Shows "Lines object is (null)"
}
return self;             

【问题讨论】:

  • 你能告诉我们ClassA的init吗
  • myClassAVariable=[[ClassA alloc]]init ] 语法无效,能否贴出实际代码?
  • 你知道它被强烈引用吗?你能粘贴ClassA的定义吗?
  • 我已经更新了我的问题
  • 看看下面我的回答,你需要通过self.lines调用setter

标签: ios cocos2d-iphone


【解决方案1】:

如果lines 只是一个ivar,则在调用[[ClassA alloc]init ]; 时不会调用它的setter。我建议让它成为一个强大的属性:

ClassA.h:

@property(nonatomic,strong) NSMutableArray *lines;

在 ClassA 的 init 方法中:

//initiliaze lines:
self.lines = [[NSMutableArray alloc]init];

【讨论】:

  • 它确实有效,伙计。我忘记了另一个细微的差别。我忘记了我必须调用 self.draw.lines 而不是 [self.drawlines]。 :) 所以谢谢你的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2011-11-04
  • 2020-11-12
相关资源
最近更新 更多