类没有按预期设置

时间:2011-08-06 13:18:44

标签: iphone objective-c class setter getter

图标设置为@property (nonatomic, retain) AHGridIcon *icon;

通常我只是这样做:

-(void)setIcon:(AHGridIcon *)iconLocal {
icon = iconLocal;
} 

但是,我在线阅读了一本关于吸气者安装者和财产的指南,这让我相信这是正确的:

-(void)setIcon:(AHGridIcon *)iconLocal {
    if (iconLocal != self.icon)
    {
        NSLog(@"local: %@", iconLocal);
        NSLog(@"self.icon 1: %@", self.icon);
        [iconLocal retain];
        [icon release];
        icon = iconLocal;
        NSLog(@"self.icon 2: %@", self.icon);
    }
}

问题是,原始图标保持不变,它不会被新图标替换。我究竟做错了什么?我应该恢复到通常的方式吗?

2 个答案:

答案 0 :(得分:2)

除非你真的需要自定义setter行为,否则你应该使用'@synthesize'。

答案 1 :(得分:1)

像我在评论中发表的那样:

最好的方法是使用@synthesize,根据您在属性(nonatomic, retain) =>中创建的属性创建一个getter和setter。不是线程安全但快速的getter和setter以及保留(也是释放)setter。如果你不需要在你的setter中做一些复杂的东西,那么你不应该覆盖setter。

·H:

@property (nonatomic, retain) AHGridIcon *icon;

的.m:

@implementation Something
@synthesize icon;
...
@end

您在setter中发布的代码与仅使用synthesize时编译器生成的代码几乎相同。

您通常的方式并不是很好,因为在您的标题中定义了(在您的属性中)setter保留但在您的实现中,您将覆盖那些不保留的正确setter。它与编译器使用(非原子,赋值)属性生成的几乎相同。

但是如果你想覆盖你的setter那么它应该和你写的一样。对我来说它工作正常。

  1. 首先保留新对象
  2. 然后发布旧的
  3. 然后将本地指针指定给新对象
  4. 你甚至可以省略你的if,但是你首先保留新的然后释放旧的对象非常重要(就像你做的那样 - 只是想提一下)。

    为了解决你的问题,我的眼睛看起来很好。你有没有超过吸气剂?如果是,则在此处发布(您通过在日志调用中调用self.icon来使用它。)

    我做了一个小测试程序

    @synthesize str;
    
    - (void)setStr:(NSString *)localStr
    {
        if(str != localStr)
        {
            NSLog(@"old : %@", self.str);
            NSLog(@"new1: %@", localStr);
            [localStr retain];
            [str release];
            str = localStr;
    
            NSLog(@"new2: %@", self.str);
        }
    }
    

    ,输出正常:

    old : (null)
    new1: Hello
    new2: Hello
    
    old : Hello
    new1: World
    new2: World