基本目标-C问题......让我发疯

时间:2009-04-25 19:45:38

标签: objective-c

自从我完成任何编程以来已经很长时间了。曾经在阅读C& C ++ ......从未写过多少。

我有一个非常简单的类,我想用它来操作数组的内容(使用NSMutableArray)。数组需要作为一个对象持久存在,所以我可以在一次运行程序期间对它进行多次更新(不担心将状态数据存储到磁盘)

这是我的问题。我不清楚我应该在何时/何时使用Alloc / Init我的Array对象,以便每次在我的iPhone视图上单击按钮时它都处于可用状态。

我正在尝试创建一个ViewController的SubClass,其中包含一个Array作为实例变量,然后可以在响应View中按钮点击的代码中引用它。我尝试了3种方法

  1. 我试图在我作为同一个类的一部分编写的方法中引用数组实例变量。此版本的代码中没有Alloc / Init。当我调用addObject函数时,它似乎失败了,因为尚未分配/初始化数组对象。

  2. 我还尝试在viewWillDisplay方法中使用Alloc / Init实现我的数组对象的实例。 Xcode编译器抱怨我从未使用过新分配的对象。

  3. 对于踢,我在我正在编写的'按钮点击'方法的范围内完成了一个alloc / init ...当然,每次点击我的按钮时都会分配一个新实例。

  4. 以下是我的示例.h.m文件中的内容(显示方案1)

    如果有人可以填写GIANT空白,我会非常感激我显然已经理解了应该如何使用Instance Variable对象。 (我已经阅读了关于Obj-C..etc的各种苹果文档。还搜索了我的大脑试图找到解释。

    .h:

    #import <UIKit/UIKit.h>
    
    @interface ArrayManagerViewController : UIViewController {
        NSMutableArray *buttonArray;
    }
    - (IBAction)buttonClicked:(id)sender;
    
    @end
    

    而.m

    #import "ArrayManagerViewController.h"
    
    @implementation ArrayManagerViewController
    
    - (IBAction) buttonClicked:(id)sender {
        NSString *senderTitle = [sender currentTitle];
        int intSenderTitle = [senderTitle intValue];
        [buttonArray insertObject:[NSString stringWithFormat:@"%d",
                                                             intSenderTitle]
                          atIndex:intSenderTitle];
    
        for (id obj in buttonArray)
            NSLog(@"Object Value %@", obj);
    }
    

3 个答案:

答案 0 :(得分:3)

如果在ViewController的整个生命周期中使用了数组,则可以在ArrayManagerViewController init(override)方法中分配/初始化数组,并在dealloc覆盖中调用release。

@implementation ArrayManagerViewController

- (ArrayManagerViewController *) init
{
    if (self = [super init])
    {
        [[buttonArray alloc] init];
    }

    // handle errors...

    return self;
}

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

// other methods

@end

答案 1 :(得分:1)

好吧,Objective C可能有点烦人,因为你基本上有两种语法,C和Smalltalk。您需要使用类似

的代码创建数组
buttonArray = [[NSMutableArray alloc] init] ;

有一个很好的轻量级教程here

答案 2 :(得分:1)

您应该知道必须在构造函数

中初始化实例变量 初始化UIViewController的

消息是(通常)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

所以你的实现将是

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
       // Custom initialization
       buttonArray = [[NSMutableArray alloc] init];
    }
    return self;
}

并且不要忘记在dealloc消息中释放你的buttonsArray

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

P.S.:在开始编写代码之前,先阅读developer.apple.com上的ObjC基础知识和Cocoa Memory Management