NSMutableArray作为实例变量alway null

时间:2012-02-03 10:21:39

标签: objective-c ios nsmutablearray

经过几个小时的浪费,我正式向专家寻求帮助!

我的问题在于使用NSMutableArray作为实例变量,并尝试添加对象并在我的类中的方法中返回数组。我显然做了一些根本错误的事情并且会感激帮助...我已经尝试了关于stackoverflow的其他类似问题的所有建议,阅读apple文档,以及我能想到的基本上所有试错编码的组合。可变数组总是返回(null)。我甚至尝试为它们创建属性,但是数组仍然返回(null)然后我也遇到了内存管理问题,因为设置属性时保留,以及类的init方法中的init。

以下是我要做的事情:

1)循环浏览一系列UISwitch,如果它们“打开”,则在NSMutableArray中添加一个字符串

2)在另一个方法中将这个可变数组分配给另一个数组

任何帮助非常感谢,

安迪

对于某些代码......

fruitsViewController.h

#import <UIKit/UIKit.h>

@interface fruitsViewController : UIViewController
{
    NSMutableArray *fruitsArr;
    UISwitch *appleSwitch;
    UISwitch *orangeSwitch;
}

@property (nonatomic,retain) NSMutableArray *fruitsArr; // ADDED ON EDIT
@property (nonatomic,retain) IBOutlet UISwitch *appleSwitch;
@property (nonatomic,retain) IBOutlet UISwitch *orangeSwitch;

- (IBAction)submitButtonPressed:(id)sender;
@end

fruitsViewController.m

#import "fruitsViewController.h"

@implementation fruitsViewController

@synthesize fruitsArr; // ADDED ON EDIT
@synthesize appleSwitch, orangeSwitch;

/* COMMENTED OUT ON EDIT
-(id)init
{
    if (self = [super init]) {
        // Allocate memory and initialize the fruits mutable array
        fruitsArr = [[NSMutableArray alloc] init];
    }
    return self;
}
*/

// VIEW DID LOAD ADDED ON EDIT
- (void)viewDidLoad
{
    self.fruitsArr = [[NSMutableArray alloc] init];
}

- (void)viewDidUnload
{
    self.fruitsArr = nil;
    self.appleSwitch = nil;
    self.orangeSwitch = nil;
}

- (void)dealloc
{
    [fruitsArr release];
    [appleSwitch release];
    [orangeSwitch release];
    [super dealloc];
}

- (IBAction)submitButtonPressed:(id)sender
{
    if ([self.appleSwitch isOn]) {
        [self.fruitsArr addObject:@"Apple"; // 'self.' ADDED ON EDIT
    }
    if ([self.orangeSwitch isOn]) {
        [self.fruitsArr addObject:@"Orange"; // 'self.' ADDED ON EDIT
    }
    NSLog(@"%@",self.fruitsArr); // Why is this returning (null) even if the switches are on?!
    [fruitsArr addObject:@"Hello World";
    NSLog(@"%@",self.fruitsArr); // Even trying to add an object outside the if statement returns (null)
}
@end

5 个答案:

答案 0 :(得分:7)

似乎你的init函数永远不会被调用。如果要从NIB初始化此视图控制器,则需要使用initWithCoder。如果没有,只需在viewDidLoad中声明您的fruitsArr。

答案 1 :(得分:2)

使用view did load而不是init ...

- (void)viewDidLoad
{
    fruitsArr = [[NSMutableArray alloc] init];
}

答案 2 :(得分:0)

更改init viewDidLoad,看看会发生什么

答案 3 :(得分:0)

您的init方法是否被调用(在complicationsViewController中)。添加一个NSLog来检查这个,你可能正在调用initWithNib:

viewDidUnload,您应该删除self.fruitsArr = nil;,或者,如果您想保留它,请在viewDidLoad中初始化fruitsArr(并将其从init中删除)。< / p>

答案 4 :(得分:0)

因为fruitsArr不是init。 你应该先做到这一点:      fruitsArr = [[NSMutableArray alloc] init];

所以,我认为你在使用fruitsArr之前不要运行 - (id)init。