gpt4 book ai didi

iphone - 改变self的指针

转载 作者:行者123 更新时间:2023-12-03 16:49:20 26 4
gpt4 key购买 nike

我有一个对象,我像平常一样分配/初始化只是为了获取一个实例。稍后在我的应用程序中,我想从磁盘加载该对象的状态。我想我可以取消归档我的类(符合 NSCoding)并交换我的实例指向的位置。为此我使用这段代码...

NSString* pathForDataFile = [self pathForDataFile];
if([[NSFileManager defaultManager] fileExistsAtPath:pathForDataFile] == YES)
{
NSLog(@"Save file exists");
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:pathForDataFile];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];

Person *tempPerson = [unarchiver decodeObjectForKey:@"Person"];
[unarchiver finishDecoding];
[unarchiver release];

if (tempPerson)
{
[self release];
self = [tempPerson retain];
}
}

现在,当我在我的应用程序中撒一些 NSLog 时,我注意到

self.person: <Person: 0x3d01a10> (After I create the object with alloc/init)
self: <Person: 0x3d01a10> (At the start of this method)
tempPerson: <Person: 0x3b1b880> (When I create the tempPerson)
self: <Person: 0x3b1b880> (after i point self to the location of the tempPerson)
self.person: <Person: 0x3d01a10> (After the method back in the main program)

我错过了什么?

最佳答案

不要这样做。除了违反身份规则之外,您还无法更改程序其他部分所保存的指针值。

更好的方法是使用 PIMPL 习惯用法:您的类拥有一个指向实现对象的指针,您只需交换它即可。

例如类似这样的事情:

@class FooImpl;
@interface Foo {
FooImpl* impl;
}
// ...
- (void)load;
@end

@implementation Foo
- (void)load {
FooImpl* tmp = loadFromDisk();
if (tmp) {
FooImpl* old = impl;
impl = tmp;
[old release];
}
}
@end

关于iphone - 改变self的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806096/

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