【问题标题】:NSPointerFunctionsCopyIn confusionNSPointerFunctionsCopy陷入混乱
【发布时间】:2013-12-04 01:22:06
【问题描述】:

我尝试将NSDate 对象添加到配置有 (NSPointerFunctionsCopyIn) 选项的NSPointerArray

NSDate *today= [NSDate date];

NSPointerArray *p_arr = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsCopyIn];

[p_arr addPointer:(void *)today];

 // comparing addresses;

 NSLog(@" Addresses are: %p  , %p " , today , [p_arr pointerAtIndex:0]);

//Addresses are:0x1004005d0  , 0x1004005d0

但正如我所知道的“NSPointerFunctionsCopyIn”,我的指针数组中的对象应该是一个新副本而不是共享对象。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    如中所述 Friday Q&A 2010-05-28: Leopard Collection Classes, NSPointerFunctionsCopyIn 选项导致对象指针被“复制”使用 NSCopying 协议。这并不一定意味着创建了一个新对象。

    不可变对象的情况下(如NSDate),NSCopying可以通过保留实现 原件而不是创建一个新副本。这就是发生的事情 在你的情况下:

    NSDate *today = [NSDate date];
    NSDate *today2 = [today copy];
    
    NSLog(@"%p %p", today, today2);
    // Output: 0x1001040f0 0x1001040f0
    

    【讨论】:

    • 在这种情况下,“NSPointerFunctionsStrongMemory”和“NSPointerFunctionsCopyIn”有什么区别,因为它们都会保留新添加的对象?
    • 据我了解,这些选项是相互独立的。 “NSPointerFunctionsStrongMemory”是一个“内存选项”,意味着(与默认的“NSPointerFunctionsObjectPersonality”相关),该对象被保留。 "NSPointerFunctionsCopyIn" 导致在对象上调用 copyWithZonecopyWithZone 可能会返回一个新对象或简单地保留传递的对象(请参阅 NSCopying 协议文档)。如果你用 NSMutableString 测试你的代码,你会得到一个不同的对象。
    • @user3061088:你到底在担心什么?一个 NSDate 对象不能被改变,所以无论你得到一个指向原始对象的指针,还是一个指向新对象的指针,都没有关系。
    • 我明白了,如果我添加一个可变对象,它将创建新对象,但如果我添加一个不可变对象,它将保留旧对象,thanx buddy
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2013-11-29
    相关资源
    最近更新 更多