Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Cocoa:access@public NSArray在从一个类更新到另一个类之后_Xcode_Macos_Cocoa_Xcode4_Osx Lion - Fatal编程技术网

Xcode Cocoa:access@public NSArray在从一个类更新到另一个类之后

Xcode Cocoa:access@public NSArray在从一个类更新到另一个类之后,xcode,macos,cocoa,xcode4,osx-lion,Xcode,Macos,Cocoa,Xcode4,Osx Lion,更新后如何访问@public NSArray或NSMutableArray?从一个班级到另一个班级 我可以通过调用-(id)init访问它。。当程序启动时,但如果我想稍后更新它,我得到零。有什么问题吗 简单示例代码: 我的头等舱 #import <Foundation/Foundation.h> @interface MyFirstClass : NSObject { @public NSArray *testArray; } -(IBAction)Button:(i

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

我可以通过调用
-(id)init
访问它。。当程序启动时,但如果我想稍后更新它,我得到零。有什么问题吗

简单示例代码:

我的头等舱

#import <Foundation/Foundation.h>

@interface MyFirstClass : NSObject
{
@public

    NSArray *testArray;

}

-(IBAction)Button:(id)sender;

@end
简单类

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

@interface SimpleClass : NSObject
{
    MyFirstClass *other;
}

-(IBAction)ButtonGet:(id)sender;

@end

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

欢迎来到目标C!如果你感到不知所措,并想阅读一些介绍性材料,请看一下彼得·霍西的优秀作品中的链接

您在
-[SimpleClass ButtonGet:
中创建
MyFirstClass
实例,并且由于其
testArray
成员未在
-[MyFirstClass init]
中显式分配,因此它(正确地)初始化为nil。它将永远保持这种方式,除非你给它分配了其他东西,但你永远不会这样做。(您仅在
[MyFirstClass Button://code>中为其赋值,但从不调用该方法。)

其他需要考虑的事项:

  • 手动内存管理要求您在编写代码时了解并始终牢记它们。例如,当您将
    +[NSArray arraywhithobjects://code>的结果分配给成员变量时,需要保留该结果,并在
    -[MyFirstClass dealloc]
    中释放该结果。类似地,您需要在
    -[SimpleClass dealloc]
    中释放
    其他
    对象

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

  • >P>请考虑用小写字母跟踪和启动方法名称。它使您的代码更适合系统API,并使其他人更容易阅读


请编辑您的问题,并在声明实例变量的位置、为其分配数组实例的位置以及尝试使用它的位置发布代码。另外,您使用的是垃圾收集、ARC还是手动内存管理?谢谢您的评论,我没有使用垃圾收集,我使用的是手动内存管理。在
awakeFromNib
中放置一个断点,然后在调试器面板中右键单击
testArray
,然后选择“监视变量”。这样,下一次修改变量时,调试器将暂停您的程序。@zneak抱歉我犯了一个错误,awakeFromNib不能运行。。它只是带有-(id)init{…}的wotks。也许你知道为什么?也许回来有什么问题?非常感谢你的回答。你说“给它分配其他东西”是什么意思?你能给我举个例子吗?我在按下按钮时调用它,否?您使用赋值运算符(
=
)为成员变量赋值—您已经在
-[MyFirstClass button:]
中编写了执行此操作的代码。但是,在您的示例中,该代码从未实际执行过。要调用该方法,您可以(例如)插入语句
[其他按钮:nil]MyFirstClass
对象之后,但在检查
testArray
之前,在
-[SimpleClass ButtonGet]
中选择code>。有按钮吗?你的问题中没有提到任何按钮。有两个按钮—(iAction)按钮:和—(iAction)按钮:对不起,我没有提到。所以我在按下“按钮”时执行这个代码,不是吗?来自其他类的其他按钮“ButtonGet”是我的示例场景:创建的示例应用程序在*.xib中有两个按钮。一个按钮名为“button”(MyFirstClass),另一个按钮名为“ButtonGet”(SimpleClass)。所以,当程序启动时,需要先按“按钮”,然后按“按钮”,然后再按“按钮”,如果得到testArray,NSLog应该写“正在工作!”,如果没有,则写“不工作!”。它总是显示“不工作!”。在
-[MyFirstClass Button://code>中放置一个断点或NSLog以验证它是否实际运行--它可能在xib中没有正确连接。您还必须修复未恢复的成员问题,否则
testArray
几乎会立即被解除分配,并且您将有一个指针指向任何地方。
#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