0

C伙计们,我是一个刚刚跳入Obj-C几天的新手。我有这个问题,我知道这可能很简单,但我确实花了很多时间在网上搜索但找不到相关答案,请在此处提供帮助。

我正在尝试编写一个简单的 n 元树数据结构以供练习。我创建了一个名为 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,但是循环结束后,child的内容会变为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]);

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

请帮忙,谢谢。

4

1 回答 1

1

因为 ICNode 的parentcontent属性是weak,所以一旦最后一个强引用消失,它们就会变成 nil 。

在您拥有的代码片段中,content是从局部变量设置的string,并且该变量是 for 循环的局部变量。如果将它移到 for 循环之外,进入函数主体,ICNode 的content属性将不会变为 nil。

但是很可能你想content成为一个强大的,而不是的。

于 2012-11-23T04:30:09.370 回答