Я могу проверить значение @property в Objective C с помощью @synthesized методы?

Хотя я и не был связан напрямую с C, я хотел бы узнать о технике использования ASSERT для раннего обнаружения ошибок (например, задолго до некоторой странной ошибки, вызванной перезаписью памяти). Вместо этого я самостоятельно обнаружил это несколько лет спустя. Эта техника обнаружила множество ошибок (в том числе очень тонких), которые в противном случае остались бы незамеченными.

В общем случае утверждение добавляется всякий раз, когда можно сделать некоторое предположение о значении в программе, например, оно никогда не бывает отрицательным или равным нулю или больше, чем какая-либо другая переменная.

Например:

assert(pInt)

, если предполагается, что pInt будет указывать на разумные данные. Будет стрелять по нулевому указателю. Часто используется для указателей, передаваемых функциям.

Или

assert(pInt < pMax)

, где pMax указывает сразу за концом целочисленного массива, над которым работает pInt.

Или

утверждают (yMass> 57.90)

(где yMass - масса одиночного заряженного y-иона для пептида)

9
задан stefanB 12 June 2009 в 06:51
поделиться

2 ответа

Предполагая, что ваши свойства совместимы с ключом-значением (как если бы вы использовали @synthesize), вы также должны реализовать валидаторы, совместимые с ключом-значением. Взгляните на документацию Apple по этому вопросу: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html

Важно отметить, что проверка не выполняется автоматически, кроме случаев использования определенных видов привязки. Вы либо вызываете валидатор напрямую, либо вызываете validateValue: forKey: error: .

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

8
ответ дан 4 December 2019 в 20:24
поделиться

Когда вы используете @synthesize, создаются методы доступа. Вы можете реализовать свою собственную, которая перезапишет сгенерированный.

Вы можете поместить свою собственную реализацию в методы доступа, например, вы можете добавить проверку значения перед назначением и т. Д.

Вы можете опустить один или другой или оба , те, которые вы не реализуете, будут сгенерированы из-за @synthesize, если вы используете @dynamic, вы указываете, что вы будете предоставлять аксессоры либо во время компиляции, либо во время выполнения.

Аксессоры будут иметь имена, производные от имени свойства myproperty и setMyproperty . Сигнатуры методов стандартные, поэтому их легко реализовать самостоятельно. Фактическая реализация зависит от определения свойства (копирование, сохранение, присвоение) и от того, доступно оно только для чтения или нет (только для чтения не t получить набор аксессуаров). Дополнительные сведения см. В справочнике objective-c.

Ссылка Apple:

@synthesize Вы используете @synthesize ключевое слово, чтобы сообщить компилятору, что он должен синтезировать сеттер и / или методы получения для свойства, если вы не поставляйте их в @implementation block.

@interface MyClass : NSObject
{
    NSString *value;
}
@property(copy, readwrite) NSString *value;
@end


@implementation MyClass
@synthesize value;

- (NSString *)value {
    return value;
}

- (void)setValue:(NSString *)newValue {
    if (newValue != value) {
        value = [newValue copy];
    }
}
@end
3
ответ дан 4 December 2019 в 20:24
поделиться