【问题标题】:Cocoa: access @public NSArray after update it from one class to another可可:从一个类更新到另一个类后访问@public NSArray
【发布时间】:2011-11-03 22:42:03
【问题描述】:

更新后如何访问@public NSArrayNSMutableArray?从一个班级到另一个班级?

我可以在程序启动时调用-(id)init.. 来访问它,但如果我想稍后更新它,我会得到零。有什么问题?

简单示例代码:

MyFirstClass.h

#import <Foundation/Foundation.h>

@interface MyFirstClass : NSObject
{
@public

    NSArray *testArray;

}

-(IBAction)Button:(id)sender;

@end

MyFirstClass.m

#import "MyFirstClass.h"

@implementation MyFirstClass
- (id)init {
if (self = [super init]) {

    //I can take this Array from here

    //testArray = [NSArray arrayWithObjects: @"first", @"second", @"third", nil];

}
    return self;
}

-(IBAction)Button:(id)sender {

    //How take this Array?

    testArray = [NSArray arrayWithObjects: @"first", @"second", @"third", nil];

}

@end

SimpleClass.h

#import <Foundation/Foundation.h>
#import "MyFirstClass.h"

@interface SimpleClass : NSObject
{
    MyFirstClass *other;
}

-(IBAction)ButtonGet:(id)sender;

@end

SimpleClass.m

#import "SimpleClass.h"
#import "MyFirstClass.h"

@implementation SimpleClass

-(IBAction)ButtonGet:(id)sender {

    other = [[MyFirstClass alloc] init];     

    if(other->testArray) {
        NSLog(@"Working!");
    }
    else { NSLog(@"Not working!"); }

}

@end

创建的示例在 *.xib 中有两个按钮。一个名为“Button”(MyFirstClass)的按钮和另一个名为“ButtonGet”(SimpleClass)的按钮。所以当程序启动时需要按下“Button”然后“ButtonGet”,之后 NSLog 应该写“Working!”如果它得到 testArray,如果没有 - “不工作!”。它总是显示“不工作!”。

【问题讨论】:

  • 请编辑您的问题并将代码发布在您声明实例变量的位置、为它分配数组实例的位置以及您尝试使用它的位置。另外,您是在使用垃圾收集、ARC 还是手动内存管理?
  • 感谢您的评论,我没有使用垃圾回收,我使用的是手动内存管理。
  • awakeFromNib 中放置一个断点,然后在调试器面板中右键单击testArray 并选择“监视变量”。这样,下次修改变量时,调试器将暂停您的程序。
  • @zneak 对不起,我犯了一个错误,它不是用 awakeFromNib 工作的。它只是用 - (id)init {...} 工作的。也许你知道为什么?回来可能有什么问题?

标签: xcode macos cocoa xcode4 osx-lion


【解决方案1】:

欢迎来到目标 C!如果您感到不知所措,并想阅读一些介绍性材料,请查看 Peter Hosey 出色的 "Useful Cocoa/Cocoa Touch Links" card 中的链接。

您在-[SimpleClass ButtonGet:] 中创建MyFirstClass 实例,并且由于其testArray 成员未在-[MyFirstClass init] 中显式分配,因此它(正确地)初始化为nil。除非您为它分配其他内容,否则它将永远保持这种状态,但您永远不会这样做。 (您只在[MyFirstClass Button:] 中分配给它,但您从不调用该方法。)

其他需要考虑的事项:

  • 手动内存管理要求您了解Cocoa memory management rules 并在编写代码时始终牢记它们。例如,将+[NSArray arrayWithObjects:]的结果赋值给成员变量时需要保留,并在-[MyFirstClass dealloc]中释放。同理,需要释放-[SimpleClass dealloc]中的other对象。

  • 使用属性(使用@property 声明)而不是直接引用另一个类的成员变量要简洁得多。

  • 请考虑遵循Cocoa Coding Guidelines 并以小写字母开头方法名称。它使您的代码更适合系统 API,并使其他人更容易阅读。

【讨论】:

  • 非常感谢您的回答。你说“给它分配别的东西”是什么意思你能给我举个例子吗?我按下按钮时调用它,不是吗?
  • 您使用分配运算符 (=) 将某些内容分配给成员变量——您已经在 -[MyFirstClass Button:] 中编写了执行此操作的代码。但是,该代码从未在您的示例中实际执行。要调用该方法,您可以(例如)在创建MyFirstClass 对象之后、检查testArray 之前将语句[other Button:nil]; 插入-[SimpleClass ButtonGet]。有按钮吗?您没有在问题中提及任何按钮。
  • 有两个按钮 -(IBAction)Button: 和 -(IBAction)ButtonGet:,抱歉我没有提到。所以我在按下“按钮”按钮时执行这段代码,不是吗?而从其他类其他按钮“ButtonGet”
  • 我的示例场景:创建的示例应用在 *.xib 中有两个按钮。一个名为“Button”(MyFirstClass)的按钮和另一个名为“ButtonGet”(SimpleClass)的按钮。所以当程序启动时需要按下“Button”然后“ButtonGet”,之后 NSLog 应该写“Working!”如果它得到 testArray,如果没有 - “不工作!”。它总是显示“不工作!”。
  • -[MyFirstClass Button:] 中放置断点或 NSLog 以验证它是否实际运行——它可能未在 xib 中正确连接。您还必须解决未保留的成员问题,否则testArray 将几乎立即被释放,并且您将有一个指向无处的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2023-03-31
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多