我正在尝试将一个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];
关于我做错了什么的想法?
答案 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。
尽管对象使用访问器方法或点语法访问自己的属性是最佳做法,但可以直接从类实现中的任何实例方法访问实例变量。
答案 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];