更新后如何访问@public NSArrayNSMutableArray?从一堂课到另一堂课?

我可以在程序启动时通过调用-(id)init ..来访问它,但是如果以后要更新它,则显示为nil。有什么问题?

简单的示例代码:

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


简单类

#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,如果不是,则为“不起作用!”。它总是显示“不工作!”。

最佳答案

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

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

要考虑的其他事项:


手动内存管理要求您了解Cocoa memory management rules,并在编写代码时始终牢记它们。例如,当将+[NSArray arrayWithObjects:]的结果分配给成员变量时,需要保留该结果,并在-[MyFirstClass dealloc]中释放它。同样,您需要释放other中的-[SimpleClass dealloc]对象。
使用属性(使用@property声明)比直接引用另一个类的成员变量要干净得多。
请考虑使用Cocoa Coding Guidelines,并以小写字母开头。它使您的代码更适合系统API,并使其他人更容易阅读。

10-08 09:29