菜鸟教程小白 发表于 2022-12-13 03:32:43

ios - 为什么我的对象会发生意外变化?


                                            <p><p>我有一个非常基本的示例,我正在将一些数据从 JSON 读取到一个类中,并且我的对象正在以某种方式损坏。我怀疑我遗漏了有关属性/ARC 工作方式的一些细节,但我不确定它是什么,或者我将如何追踪它。</p>

<p>我已经减少了我的原始代码,这样问题就很明显了。然而,这意味着不清楚我为什么要使用自定义属性等 - 我的真实代码在那里有更多功能......</p>

<p>这个问题可以在 Test.m 文件的最后一行看到。第一个构造的对象现在包含来自第二个对象的数据,而不是它最初包含的值。 </p>

<p>任何关于我做错了什么和/或如何追查此类问题的建议将不胜感激。</p>

<p><strong>ANBNote.h</strong></p>

<pre><code>@interface ANBNote : NSObject
@property (nonatomic,readwrite) NSArray* references;
- (id)initWithJson:(NSDictionary*)data;
@end
</code></pre>

<p><strong>ANBNote.m</strong></p>

<pre><code>#import &#34;ANBNote.h&#34;

@implementation ANBNote
NSArray * _references;

-(id) init {
if(!(self=)) return nil;
_references=@[];
return self;
}

-(id)initWithJson:(NSDictionary *)jsonObject {      
if(!(self = ) ) { return nil; }   
_references = jsonObject[@&#34;references&#34;];   
return self;
}

-(void) setReferences:(NSArray *)references {
_references = references;
}

-(NSArray *)references {
return _references;
}   

@end
</code></pre>

<p><strong>Test.m</strong></p>

<pre><code>...
NSDictionary * d1 = @{@&#34;references&#34;:@[@&#34;r1&#34;,@&#34;r2&#34;]};
NSDictionary * d2 = @{@&#34;references&#34;:@[@&#34;q1&#34;,@&#34;q2&#34;]};

ANBNote * n1 = [ initWithJson:d1];
NSLog(@&#34;R1 = %p, %@&#34;, n1.references, n1.references); // Prints r1, r2 - as expected

ANBNote * n2 = [ initWithJson:d2];
NSLog(@&#34;R2 = %p, %@&#34;, n2.references, n2.references); // Prints q1, q2 - as expected
NSLog(@&#34;R1 = %p, %@&#34;, n1.references, n1.references); // Prints q1, q2 - Oh No!
</code></pre>

<p>请注意,如果我删除自定义引用属性函数并依赖编译器生成的版本,一切似乎都正常运行。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这不是 ivar:</p>

<pre><code>@implementation ANBNote
NSArray * _references;
</code></pre>

<p>这是一个全局性的。您的类的所有实例只有一个,而不是每个实例一个。当下一个实例设置它时,前面的实例会看到新值,因为它是同一个变量。您需要将其放入花括号中以使其成为 ivar:</p>

<pre><code>@implementation ANBNote
{
    NSArray * _references;
}
</code></pre>

<p>不过,无需显式声明变量——您仍然可以自己实现访问器,并让编译器创建 ivar,只要您使用默认的合成名称(下划线 + 属性名称)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么我的对象会发生意外变化?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18285624/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18285624/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么我的对象会发生意外变化?