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