Objective-C NSString在循环后变为null

时间:2012-11-22 22:47:43

标签: objective-c pointers

C大人,我是一个刚刚跳进Obj-C几天的新人。我有这个问题,我知道也许这不是一件容易的事,但我确实花了很多时间在网上搜索但找不到相关的答案,请在这里帮忙。

我正在尝试编写一个简单的n-ary树数据结构,仅供练习。我创建了一个名为ICNode的类,其中包含一个NSMutableArray,用于它的子节点,父节点和深度。

#import <Foundation/Foundation.h>

@interface ICNode : NSObject
{

}
@property (nonatomic, weak) id content;
@property (nonatomic, weak) ICNode *parent;
@property (nonatomic, strong) NSMutableArray *children;     // should store ICNode
@property (nonatomic) int depth;    // root is 0, not set is -1

然后我写了一个简单的测试代码来测试它。

for (int i = 1; i <= 2; i++) {
    NSString *string = [[NSString alloc] initWithFormat:@"Test %d", i];
    ICNode *child = [[ICNode alloc] init];
    [child setContent:string];
    [root addChild:child];
    STAssertEqualObjects([child parent], root, @"child's parent is root");
    STAssertEquals([child depth], 1, @"children's depth is 1");
}
STAssertEquals([root numberOfChildren], 2, @"root's number of children is testRun");
NSLog(@"%@", root);

我的问题是,在最后一行代码NSLog中,我希望看到类似这样的内容:

"Content: Test 1(depth=1) -> Parent: I am Root -> Children: (null)",
"Content: Test 2(depth=1) -> Parent: I am Root -> Children: (null)"

但它总是

"Content: (null)(depth=1) -> Parent: I am Root -> Children: (null)",
"Content: (null)(depth=1) -> Parent: I am Root -> Children: (null)"

然后我在那里放了一个断点,发现在addChild方法之后,它就是find,但是在循环结束后,子节点的内容将变为null。我不熟悉指针的东西,所以我怀疑这是与指针有关的东西。

另一个观察是我做了这样的事情,

NSString *string = [[NSString alloc] initWithFormat:@"Test %d", 1];
ICNode *child = [[ICNode alloc] initWithContent:string parent:root];
NSString *string1 = [[NSString alloc] initWithFormat:@"Test %d", 2];
ICNode *child1 = [[ICNode alloc] initWithContent:string1 parent:root];
NSLog(@"%@", [root description]);

然后输出就好了。但我确实希望能够使用循环创建节点。

请帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

由于ICNode的parentcontent属性,一旦最后一个强引用消失,它们就会变为零。

在代码片段中,您从局部变量content设置了string,该变量是for循环的本地变量。如果将它移动到for循环之外的ICNode函数的主体中,则content属性将不会变为零。

但是,您可能希望content成为强,复制属性,而不是