Почему происходит сбой моей программы при обращении к свойству с помощью self. а синтезированный аксессор? - PullRequest
2 голосов
/ 11 июля 2009

У меня есть класс объекта данных:

@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.

Ответы [ 3 ]

3 голосов
/ 11 июля 2009

Сеттер должен быть закодирован следующим образом:

[title autorelease]
title = [aString copy];

В противном случае другой поток может получить титульный объект под ногами.

Или выберите любой другой согласованный стиль доступа из Руководства по программированию управления памятью для какао

0 голосов
/ 11 июля 2009

В этом коде [self setTitle:[self title]] освободит и освободит title перед копированием. Вам нужно проверить, если title == aString в сеттере.

0 голосов
/ 11 июля 2009

Код, который вы разместили, прекрасно работает для меня. Есть ли что-то другое между этим кодом и реальным кодом, который вы используете?

Сообщения об ошибках, которые вы видите, ссылаются на «зомби», которые являются указателями на объекты, которые уже были освобождены. Ничто в этом коде не показывает никакого риска такого поведения, что заставляет меня думать, что настоящая ошибка в другом месте.

Одним из возможных решений было бы использование отладчика XCode для просмотра адресов ваших NSString объектов и использование этой информации для определения того, какой из них в итоге выдает предупреждение NSInvocation.

...