Iphone 访问ViewController.m(xCode/Objective C)中的类数据成员

Iphone 访问ViewController.m(xCode/Objective C)中的类数据成员,iphone,objective-c,xcode,Iphone,Objective C,Xcode,我有一个类myClass,想访问它的属性,一个NSArray*currentOptions(特别是获取currentOptions的大小,并访问我放在其中的NSStrings。) 我有一个名为generate options的方法,它将填充数组分配给*currentOptions。在我尝试访问*currentOptions之前,会调用Generate options。myClass的一个实例也已通过应用程序委托添加到ViewController中。但是,当调用buttonOnePressed时,

我有一个类myClass,想访问它的属性,一个
NSArray*currentOptions
(特别是获取
currentOptions
的大小,并访问我放在其中的NSStrings。)

我有一个名为generate options的方法,它将填充数组分配给
*currentOptions
。在我尝试访问
*currentOptions
之前,会调用Generate options。myClass的一个实例也已通过应用程序委托添加到ViewController中。但是,当调用buttonOnePressed时,我不断遇到以下错误:

[myClass currentOptions]:发送到实例0x9b10490的选择器无法识别

以下是我的代码部分:

 //TClass.h
@interface TClass : NSObject {
        NSArray *currentOptions;

    }

    @property (nonatomic, retain) NSArray *currentOptions;
    @end


//viewController
- (IBAction) buttonOnePressed:(id)sender {
    NSLog(@"button1 pressed");
    NSLog(@"int: %d",[myClass.currentOptions count]); 
    //myClass here is the instance of TClass
}

有时导致该错误的一个原因是未能正确保留myClass。(旁白:“myClass”是指针的一个非常糟糕的名称,因为指向的对象几乎肯定不是一个类,而是一个对象,即一个类的实例。)如果您不保留myClass指向的对象,它将被释放。有时,在某个位置恰好创建了一个不同的对象,您最终向新对象发送了一条针对原始对象的消息,该消息是另一种类型,并且不理解该消息。

对于所有跟随者,通过进行以下更改,问题已得到解决:

1) 综合当前选项TClass.m

@implementation TClass
@synthesize currentOptions;
@end
2) 我将currentOptions设置为NSMutableArray而不是NSArray。这是因为我需要将值重新指定给当前选项。不知怎的,它在NSArray上崩溃了,在NSMutable数组上一切都很顺利

@implementation TutorialClass

    if ([currentOptions count] > 0) {
        [currentOptions removeAllObjects];
    }
    [currentOptions addObject:[options objectAtIndex:0]];
    [currentOptions addObject:[options objectAtIndex:1]];
    [currentOptions addObject:[options objectAtIndex:2]];
    [currentOptions addObject:[options objectAtIndex:3]];
3) 当然,我还必须在TClass.m的init方法中执行以下操作

currentOptions = [[NSMutableArray alloc] init];

现在该吃点东西了。谢谢Caleb:D

这意味着一旦我重新分配currentOptions,@property(retain,nonatomic)就没用了?这是因为TClass有一个名为generateOptions的方法,它为currentOptions分配一个新的NSArray。在这种情况下,如何访问currentOptions当前分配给的NSArray?无用?不,如果您正确使用该属性,则不会。我认为
myClass
只是一个错误的指针,如果是这样的话,那么您在某个地方有内存管理问题;这是否足以正确保留一个类,或者您认为故障可能位于其他地方?请查看0x9b10490处的对象(或者调试时给出的任何地址)。这将是存储在ivar
myClass
中的地址,但是那里的对象可能不是您期望的类型。此外,你似乎在抓住记忆前端的稻草:请阅读。嘿,卡莱布,你是对的。我进入了调试器,它似乎真的是currentOptions,这是有问题的。在其他对象中,比如我的问题NSArray,它在summary下表示16个对象(这是正确的),而在currentOptions中,它表示{(int)[$VAR count]}对象。我将再看一看代码和内存管理指南。:)