图标设置为@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);
}
}
问题是,原始图标保持不变,它不会被新图标替换。我究竟做错了什么?我应该恢复到通常的方式吗?
答案 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那么它应该和你写的一样。对我来说它工作正常。
你甚至可以省略你的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