我正在尝试编写一个简单的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]);
然后输出就好了。但我确实希望能够使用循环创建节点。
请帮助,谢谢。
答案 0 :(得分:1)
由于ICNode的parent
和content
属性弱,一旦最后一个强引用消失,它们就会变为零。
在代码片段中,您从局部变量content
设置了string
,该变量是for循环的本地变量。如果将它移动到for循环之外的ICNode函数的主体中,则content
属性将不会变为零。
但是,您可能希望content
成为强,复制属性,而不是弱。