希望就某事征求意见。

我有一个Levels Engine类,它创建了一个称为levelsArray的NSMutable Array。

我正在将数据传递到可以正常工作的Levels View Controller。

我也有一个粒子发射器类,希望将级别数据传递给该类。

但是,当我将其传递给“粒子发射器”类时,经常被告知该数组的计数级别为0。

阵列已正确设置:

    **LevelsEngine.h**
    @interface
    LevelsEngine : NSObject {
    NSMutableArray *levelsArray;         }

    @property (retain) NSMutableArray
    *levelsArray;




    **LevelsEngine.m**
    @synthesize levelsArray;
    LevelsArray =[NSMutableArray array];


    **Code used in ParticleEmitter.m**
    newlevelsArray = [NSMutableArray array];
    newlevelsArray=view.levelsArray;


我是否认为我遇到此错误是因为我试图将数组数据从一个NSObject传递到另一个而不是视图控制器?如果可以,如何传递数据?

最佳答案

几件事。

    **Code used in ParticleEmitter.m**
    newlevelsArray = [NSMutableArray array];
    newlevelsArray=view.levelsArray;


第一行正在创建一个新数组。
第二行将newlevelsArray分配为指向view.levelsArray中的数组的指针,而将您在第1行中创建的对象保留为孤立状态。

我认为您打算将第二行作为数组的逐字段复制,但是对象的分配不能那样工作。

您可以通过2件事解决此问题。

1)删除第一行newlevelsArray = [NSMutableArray array];

2)将第二行更改为`newlevelsArray = [view.levelsArray copy];

这实际上将创建一个副本,这可能是您想要的,因为您可以继续进行操作并在ParticleEmitter.m中修改newlevelsArray而不更改视图中的值。

重要说明:不要忘记在您的粒子发射器类中创建一个-dealloc:方法,该方法释放newlevelsArray:

-(void)dealloc {
   if (newlevelsArray) [newlevelsArray release];
   [super dealloc];
}


另一种解决方案是使用setter。

代替:

2)将第二行更改为newlevelsArray = [view.levelsArray复制];

做:

2)将第二行更改为this.newlevelsArray = view.levelsArray;
您必须使用以下方法将newlevelsArray定义为ParticleEmitter类的属性:

@property (copy) NSMutableArray * newlevelsArray;

注意使用“复制”代替“保留”。这将对数组进行逐字段复制,这对于可变对象的容器很可能是明智的选择。

10-07 13:38