objective-c – 使用自动引用计数释放self的新模式是什么?

objective-c – 使用自动引用计数释放self的新模式是什么?,第1张

概述使用NSObject方法 – (id)awakeAfterUsingCoder:(NSCoder *)解码器作为示例,文档说: Allows an object, after being decoded, to substitute another object for itself. For example, an object that represents a font might, upo 使用NSObject方法 – (ID)awakeAfterUsingCoder:(NSCoder *)解码器作为示例,文档说:

Allows an object,after being decoded,to substitute another object
for itself. For example,an object that represents a Font might,upon
being decoded,release itself and return an existing object having the
same Font description as itself. In this way,redundant objects can be
eliminated.

通常你会这样做

[self release];return substitutedobject;

使用ARC,你必须离开这条线.这不会泄漏吗?或者我应该只相信NSCoder对象为我发布原始对象?如果是这样,为什么你必须首先用非ARC代码明确释放自己?

根据编译器文档中关于self的内容,我认为self = nil是不正确的:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self

解决方法 如上所述,你不能写[self release];.另外,awakeAfterUsingCoder:不是初始化者 – 你可能不会重新分配自己.

Wouldn’t this leak?

是.在下面的程序中证明.

Or should I just trust the NSCoder object to release the original object for me?

没有.

下面是一种避免泄漏的方法 – 我不会称之为“新模式”,这只是我想到的第一种方法.它涉及自我的显式释放,在这种情况下显式保留结果:

#import <Foundation/Foundation.h>@interface MONBoolean : NSObject < NSCoding >- (ID)initWithBool:(bool)pBool;- (bool)isTrue;- (bool)isFalse;@endstatic Nsstring * const MONBoolean_KEY_value = @"MONBoolean_KEY_value";@implementation MONBoolean{    bool value;}- (ID)initWithBool:(bool)pBool{    self = [super init];    if (0 != self) {        value = pBool;    }    return self;}- (bool)isTrue{    return true == value;}- (bool)isFalse{    return false == value;}- (Nsstring *)description{    return [[Nsstring alloc] initWithFormat:@"<%s:%p> : %s",object_getClassname(self),self,self.isTrue ? "true" : "false"];}- (voID)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeBool:value forKey:MONBoolean_KEY_value];}- (ID)initWithCoder:(NSCoder *)aDecoder{    self = [super init];    if (0 != self) {        value = [aDecoder decodeBoolForKey:MONBoolean_KEY_value];    }    return self;}- (ID)awakeAfterUsingCoder:(NSCoder *)aDecoder{    const bool b = value;    // cannot reassign self outsIDe of an initializer.    // if not released,will result in a leak:    CFRelease((__brIDge const voID*)self);    MONBoolean * result = [[MONBoolean alloc] initWithBool:b];    // Now we have to retain explicitly because this is    // an autoreleasing method:    CFRetain((__brIDge const voID*)result);    return result;}@endint main(int argc,const char * argv[]){    @autoreleasepool {        MONBoolean * a = [[MONBoolean alloc] initWithBool:true];        NSData * data = [NSKeyedArchiver archivedDataWithRootObject:a];        MONBoolean * b = [NSKeyedUnarchiver unarchiveObjectWithData:data];        NSLog(@"%@",b);    }    system("leaks name_OF_PROCESS_HERE");    return 0;}
总结

以上是内存溢出为你收集整理的objective-c – 使用自动引用计数释放self的新模式是什么?全部内容,希望文章能够帮你解决objective-c – 使用自动引用计数释放self的新模式是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1238242.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存