NSMutableArray +添加UIImageView - 非常简单但不起作用 - arghh帮助

时间:2011-02-24 22:42:07

标签: iphone objective-c uiimageview nsmutablearray

我正在动态创建图像视图(一个小汉堡图标,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]);       

    } 

}

非常感谢任何帮助。

米奇。

5 个答案:

答案 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...方法。此外,正如之前的一张海报所指出的那样,初始化容量为零的可变阵列是毫无意义的。要么使用特定的非零容量(如果事先知道数组将包含多少元素),要么采用默认值。