我正在动态创建图像视图(一个小汉堡图标,fyi),并希望通过使用可变数组来跟踪它们。我在我的标题中声明数组:
NSMutableArray *myBurgers;
在我的viewDidLoad
中初始化我的数组NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];
这是我制作图像并推入数组的方法 - 目前我的数组计数返回0 - 我编译错误说'未使用的变量'myburgers'
-(void)burgerManGo:(CGPoint)location {
burgerCount=burgerCount++;
if(location.x<=(320) && location.y<=(480)){
CGRect myImageRect = CGRectMake(location.x, location.y, 65, 55);
UIImageView *myNewBurger = [[UIImageView alloc] initWithFrame:myImageRect];
[myNewBurger setImage:[UIImage imageNamed:@"burgerMan.png"]];
myNewBurger.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myNewBurger];
//but adding to my array doesn't seem to work...
[myBurgers addObject: myNewBurger];
//because this always come back as 0
NSLog(@"Array Size: %ld", [myBurgers count]);
}
}
非常感谢任何帮助。
米奇。
答案 0 :(得分:2)
您不应该创建容量为0的数组!它会在您第一次添加内容时立即调整大小。您只需调用[NSMutableArray array]
即可获得默认初始容量数组。
至于你的实际问题:根据你所写的内容,你在viewdidLoad中声明了一个名为myBurger的 new 变量。即在viewDidLoad中,您应该:
self.myBurgers = [NSMutableArray array];
而不是:
NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];
请注意self.myBurger =
将导致您的新数组被保留(假设您将myBurgers属性定义为保留,而不是分配) - 这就是您想要的。不要忘记[myBurgers release]
中的dealloc
。
答案 1 :(得分:1)
你必须保留你在viewDidLoad中创建的数组:现在你有一个自动释放的对象,并且在runloop之后就会消失。
执行:
NSMutableArray* myBurgers = [[NSMutableArray arrayWithCapacity:0] retain];
答案 2 :(得分:0)
您正在viewDidLoad
中创建新实例,而不是分配给接口成员。
答案 3 :(得分:0)
请记住
NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];
是自动发布的对象
-(void)viewDidLoad {
myBurgers = [[NSMutableArray alloc]initWithCapacity:kMaxBurgersQty];
}
-(void)dealloc {
[myBurgers release];
myBurgers = nil;
}
这将授予burger数组在运行时中间某处不会自动释放。
答案 4 :(得分:0)
如果我正确理解你,你的类会声明一个像这样的实例变量:
NSMutableArray *myBurgers;
然后按以下方式覆盖viewDidLoad
:
- (void)viewDidLoad
{
// ...
NSMutableArray *myBurgers = [NSMutableArray arrayWithCapacity:0];
// ...
}
如果是这种情况,则viewDidLoad
方法声明一个局部变量myBurgers
,该变量暂时屏蔽具有相同名称的实例变量。然后,将自动释放的数组分配给局部变量。从viewDidLoad
返回后不久就会释放数组,但无论如何它都从未分配给实例变量。
要解决此问题,请按以下步骤重写viewDidLoad
方法:
- (void)viewDidLoad
{
// ...
myBurgers = [[NSMutableArray alloc] init];
// ...
}
您要分配给实例变量的自动释放对象没有意义;而是使用alloc
和相应的init...
方法。此外,正如之前的一张海报所指出的那样,初始化容量为零的可变阵列是毫无意义的。要么使用特定的非零容量(如果事先知道数组将包含多少元素),要么采用默认值。