【问题标题】:Accessing Class Data Members in ViewController.m (xCode / Objective C)在 ViewController.m 中访问类数据成员(xCode / Objective C)
【发布时间】:2011-03-29 05:22:23
【问题描述】:

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

我有一个名为 generate options 的方法,它将填充的数组分配给*currentOptions。在我尝试访问*currentOptions 之前调用了生成选项。 myClass 的一个实例也已通过 App 委托添加到 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
}

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    有时会导致该错误的一件事是未能正确保留 myClass。 (除此之外:“myClass”对于指针来说是一个非常糟糕的名称,因为被指向的东西几乎肯定不是类而是对象,即类的实例。)如果您不保留 myClass 指向的对象,它将被释放。有时,碰巧在某个位置创建了一个不同的对象,而您最终将用于原始对象的消息发送给新对象,这是一种不同的类型并且不理解该消息。

    【讨论】:

    • 这意味着一旦我重新分配 currentOptions,@property(retain,nonatomic) 就没有用了?这是因为 TClass 有一个名为 generateOptions 的方法,它为 currentOptions 分配一个新的 NSArray。在这种情况下,如何访问当前分配给 currentOptions 的 NSArray?
    • 没用?不,如果您正确使用该属性,则不会。我认为myClass 只是一个错误的指针,如果是这种情况,那么您在某个地方遇到了内存管理问题。
    • 在 viewController.h 我有一个 @property (nonatomic, retain) IBOutlet TutorialClass *myTutorialClass;这足以正确保留一个班级吗?还是您认为错误可能出在其他地方?
    • 查看 0x9b10490 处的对象(或调试时给出的任何地址)。那将是存储在 ivar myClass 中的地址,但那里的对象可能不是您期望的类型。此外,您似乎正在抓住内存前沿的救命稻草:请阅读Memory Management Guide
    • 嘿,Caleb,你是对的。我进入调试器,似乎确实是 currentOptions 有问题。在像我的问题 NSArray 这样的其他对象中,它以某种方式在 currentOptions 中说 16 个对象在摘要下(这是正确的)它说 {(int)[$VAR count]} 个对象。我将再看一下代码和内存管理指南。 :)
    【解决方案2】:

    对于所有一直关注的人,问题已通过以下更改得到解决:

    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];
    

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

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多