【问题标题】:Why does my program crash when accessing a property with self. and a synthesized accessor?为什么我的程序在使用 self 访问属性时会崩溃。和合成访问器?
【发布时间】:2010-11-09 22:09:20
【问题描述】:

我有数据对象类:

@interface Item: NSObject {
    NSString *title;
    NSString *text;
}

@property (copy) NSString *title;
@property (copy) NSString *text;

@end

@implementation Item

@synthesize text;

- (void)updateText {
    self.text=@"new text";
}

- (NSString *)title {
    return title;
}

- (void)setTitle:(NSString *)aString {
    [title release];
    title = [aString copy];
}

@end

我可以在使用非合成方法时很好地设置title 属性,但是当我使用合成访问器设置属性时,我在updateText 方法中出现错误,内容如下:

self.text=@"new text";

错误是:

*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement doesNotRecognizeSelector: -- abort

为什么相同的非综合访问器有效而综合访问器不工作?

对象在主线程中创建,从NSOperation线程访问时出现错误。

【问题讨论】:

    标签: objective-c cocoa memory zombie-process


    【解决方案1】:

    在此代码中,[self setTitle:[self title]] 将在复制之前释放并释放 title。 您需要检查 setter 中是否有 title == aString

    【讨论】:

      【解决方案2】:

      setter 应该这样编码:

      [title autorelease]
      title = [aString copy];
      

      否则另一个线程可能会在其脚下释放标题对象。

      或者从Memory Management Programming Guide for Cocoa中选择任何其他一致的访问器样式

      【讨论】:

      • 没有必要为此浪费时间进行自动释放。 setter 的标准代码只是防止新旧标题的指针相等。 if (title != aString) { [title release];标题 = [aString 副本]; }
      • 小心:这些是字符串,我们复制它们是有原因的。 title != aString 对于可变字符串可能会变得非常讨厌
      • 我更喜欢自动释放方法。代码越少越好,99.9% 的时间性能差异并不明显。
      【解决方案3】:

      您发布的代码对我来说很好用。这段代码和你使用的实际代码有什么不同吗?

      您看到的错误消息引用了“僵尸”,它们是指向已释放对象的指针。此代码中没有任何内容显示此类行为的任何风险,这使我认为实际错误在其他地方。

      一种可能的解决方案是使用 Xcode 的调试器查看您的 NSString 对象的地址,并使用该信息确定最终导致 NSInvocation 警告的地址。

      【讨论】:

      • 对象在主线程中创建,从NSOperation线程访问时出现错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多