gpt4 book ai didi

ios - 销毁Objective-C中的对象

转载 作者:行者123 更新时间:2023-12-01 16:00:23 24 4
gpt4 key购买 nike

我正在尝试实现一个链表,所以我有一个带有头文件的Node类,如下所示:

@interface Node : NSObject

@property(nonatomic,assign)int data;
@property(nonatomic,strong) Node *right;
@property(nonatomic,strong) Node *left;

@end

然后在另一个类中,我在分配它们,然后调用一个方法来销毁给定值的所有出现:
Node *node0 = [[Node alloc]init];
Node *node1 = [[Node alloc]init];
Node *node2 = [[Node alloc]init];
Node *node3 = [[Node alloc]init];
Node *node4 = [[Node alloc]init];
node0.data = 1;
node1.data = 2;
node2.data = 5;
node3.data = 5;
node4.data = 3;
node0.right = node1;
node1.right = node2;
node2.right = node3;
node3.right = node4;
node4.right = NULL;
[self removeNodeWithValue:node0 value:5];
NSLog(@"node %d, %d, %d, %d, %d", node0.data, node1.data, node2.data, node3.data, node4.data);

这是方法本身:
-(void)removeNodeWithValue:(Node *)head value:(int)value
{
Node *toDelete;
while (head != NULL) {
if (head.data == value)
{
toDelete = head;
head = head.right;
toDelete = nil;
}
else
{
head = head.right;
}
}
}
==> 1, 2, 5, 5, 3

我知道我可以更改实例,因为如果我将 toDelete = nil更改为 toDelete.data = 4,则输出为 ==> 1, 2, 4, 4, 3。我的问题是,如何销毁这些实例?谢谢。

最佳答案

似乎您还不了解ARC的工作原理。只要有指向该对象的强大指针,该对象就不会被释放。在您的示例中,您的代码失败有两个原因:首先,您始终始终强烈引用node0:

Node *node0 = [[Node alloc]init];

只要此指针未设置为 nil(请记住,按照惯例 NULL用于常规指针, nil用于对象指针),则不会释放该节点。

其次,如果要释放的节点不是第一个节点,那么会有另一个节点持有指向它的强指针,这就是为什么该节点不会被释放的另一个原因。保留另一个指向 node0的指针(在您的情况下为 toDelete)会增加节点的节点保留数,当您将其设置为 nil时,它只会返回其原始值。

要正确执行此操作,还必须避免链删除(如果第一个节点被释放,则它会丢失对第二个节点的强引用,如果没有强大的指针指向第二个节点,则第二个节点可能会被释放,并导致第三个节点被释放,依此类推)。

最后,我建议不要仅持有指向每个节点的指针,而是实现一个链接列表类,该类将完成添加/删除节点的工作:
@interface List : NSObject

@property (nonatomic, strong) Node* first;
@property (nonatomic, weak) Node* last;

@end

// Inside the class implementation

- (void) addNodeWithValue: (int) value
{
Node* node= [[Node alloc]init];
node.data= value;
if(!first)
{
last= first= node;
}
else
{
last.right= node;
node.left= last; // left should be a weak property
last= node;
}
}

- (void) removeNodeWithValue: (int) value // O(n) method
{
Node* ptr= first;
while(ptr)
{
if(ptr.data== value)
{
if(ptr== first)
{
first= last= nil;
}
else
{
ptr.left.right= ptr.right;
ptr.right.left= ptr.left;
}
break; // Remove the break if you want to remove all nodes with that value
}
ptr= ptr.right;
}
}

我没有测试过这段代码,我不能保证它能正常工作。

关于ios - 销毁Objective-C中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com