将NSMutableArray传递给UIView类变为nil

时间:2014-12-08 12:07:42

标签: ios arrays class nsmutablearray

我正在尝试将一个NSMutable数组从View Controller类传递给UIView类。

代码:

UIView.h class

-(void)init:(NSMutableArray *)ary;

@property (nonatomic, retain) NSMutableArray *valenceArray;

UIView.m 

-(void)init:(NSMutableArray *)ary
{
     self.valenceArray = [[NSMutableArray alloc] initWithArray:ary];
    NSLog(@"%@",_valenceArray);
 }

-(void) drawgraph

{
   for (int i = 0; i < _valenceArray.count; i++)
    {
        NSString *string = [_valenceArray objectAtIndex:i];
        double value = [string doubleValue];
        NSLog(@"%f", value);
    }
}

init方法打印出传递的数组的内容。但是当我调用绘图图方法时,数组会重置为nil。

设置数组的代码:

Grid *grid = [[Grid alloc] init];
[grid init:_array];

关于我做错了什么的想法?

4 个答案:

答案 0 :(得分:2)

使用以下代码替换init方法:

-(void)init:(NSMutableArray *)ary
{
     _valenceArray = [[NSMutableArray alloc] initWithArray:ary];
    NSLog(@"%@",_valenceArray);
}

也可以使用图表方法中的self.valenceArray来访问它。同时从参数数组值中指定self.valenceArray

-(void) drawgraph:(NSMutableArray *)ary {

   self.valenceArray = ary; 

   for (int i = 0; i < _valenceArray.count; i++)
    {
        NSString *string = [self.valenceArray objectAtIndex:i];
        double value = [string doubleValue];
        NSLog(@"%f", value);
    }
}
  

实例变量是一个存在的变量,它保存对象生命周期的值。用于实例变量的内存在首次创建对象时(通过alloc)分配,并在释放对象时释放。

     

除非另行指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为firstName的属性,合成的实例变量将被称为_firstName。

     

尽管对象使用访问器方法或点语法访问自己的属性是最佳做法,但可以直接从类实现中的任何实例方法访问实例变量。

Encapsulating Data

答案 1 :(得分:0)

如果视图Grid是viewController的出口。您应该使用outlet属性来调用init函数。也许正如@KudoCC所说,你需要改变方法名称。

答案 2 :(得分:0)

我不确定这是否能解决问题,但你的方法是:

-(void)init:(NSMutableArray *)ary {}

应该返回自己(UIView),否则引用仍为null。此外,因为你的init可能(不应该)覆盖通常的init,所以它可能会弄乱一些事情,所以将其更改为:

.h:

-(id)initWithArray:(NSMutableArray *)ary;

.m:

-(id)initWithArray:(NSMutableArray *)ary
{
    self = [super init];
    self.valenceArray = ary;
    NSLog(@"%@",_valenceArray);
    return self;
}

否则,检查发送的数组是否实际已填满。

此外,我没有注意到Grid类,应该更改为:

Grid *grid = [[Grid alloc] initWithArray:_array];

答案 3 :(得分:0)

如果您从另一个UIView或控制器传递数组,我认为您不需要初始化数组。这是因为你正在重新初始化数组。只需删除init方法&amp;直接将数组传递给draw方法而不需要任何启动。

-(void) drawgraph:(NSMutableArray *)ary
{
    NSLog(@"%@",ary);
}

&安培;叫它

[grid drawgraph:_array];