Xcode iPhone: свойство ... требует, чтобы метод ... был определен-используйте @syntehsize, @dynamic или предоставьте реализацию метода
в an .M файл у меня есть 4 предупреждения, относящиеся к одной команде:
@end
свойство "myHeader" требует, чтобы метод "- myHeader " был определен-используйте @synthesize, @dynamic или предоставьте реализацию метода
свойство "customCell" требует, чтобы метод "setCustomCell:" был определен - используйте @synthesize, @dynamic или предоставьте реализацию метода
свойство "customCell" требует метода "- customCell " будет определен-используйте @synthesize, @dynamic или предоставьте реализацию метода
свойство "myHeader" требует, чтобы метод "setMyHeader" был определен-используйте @synthesize, @dynamic или предоставьте реализацию метода
Я просмотрел форумы, но я безнадежен до сих пор-можете ли вы объяснить мне (начинающий программист...) как отладить его? Огромное спасибо!
7 ответов
это означает, что вам нужно синтезировать эти переменные. Синтезирование создает методы setter и getter для вас. Для этого Вам необходимо включить следующий код в вашу реализацию (.файл м):
@synthesize myHeader;
@synthesize customCell;
добавление этих строк должно позаботиться о Ваших 4 ошибках.
У вас также есть возможность самостоятельно определить методы setter и getter, но если вы не хотите делать что-то конкретное, перейдите к @synthesize.
реанимация старого потока. Вероятно, не проблема OP, но я подумал, что стоит упомянуть об этом, если кто-то еще (как я) столкнется с этим. Вы получаете то же сообщение, если вы реализуете новое свойство в категории класса (даже озадачивает, если вы используете LLVM 4, который больше не требует @synthesize). Это возможно с помощью описанной техники здесь:
@interface SomeClass (Private)
@property (nonatomic, assign) id newProperty;
@end
NSString * const kNewPropertyKey = @"kNewPropertyKey";
@implementation SomeClass (Private)
@dynamic newProperty;
- (void)setNewProperty:(id)aObject
{
objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}
- (id)newProperty
{
return objc_getAssociatedObject(self, kNewPropertyKey);
}
@end
в заголовке класса (связанный .H файл), у вас, по-видимому, есть что-то похожее на следующее:
@property SomeClass *myHeader;
@property SomeClass *customCell;
это говорит компилятору, что вы хотите, чтобы ваш класс имел эти свойства, но вы все равно должны сказать ему, как получить и установить значения на экземплярах. У вас есть три варианта:
-
в разделе @implementation (в .файл м), вы можете добавить
@synthesize myHeader, customCell;
чтобы сообщить компилятору автоматически генерировать методы для получения и установите эти свойства. Это самое простое и обычно то, что вы хотите.
-
вы можете реализовать методы себя так:
- (SomeClass *)myHeader { // Return the value of myHeader } - (void)setMyHeader:(SomeClass *)inMyHeader { // Set myHeader to inMyHeader }
это обычно используется для производных или динамически генерируемых свойств или когда вы хотите выполнить дополнительную работу при их изменении.
можно использовать
@dynamic myHeader, customCell;
, чтобы сообщить компилятору, что реализации будут предоставлены во время выполнения. Это редко используется.
используя @property
сообщает компилятору, что вы собираетесь получить доступ к соответствующей переменной-члену через функции "setter" и "getter", т. е. функции, которые изменяют значение переменной или возвращают ее значение. Предупреждения, которые вы видите, потому что вы не определили необходимые функции. Я предполагаю, что ваш заголовок (.H-файл) выглядит примерно так:
@property(readwrite, assign) <type> myHeader;
@property(readwrite, assign) <type> customCell;
потому что вы сказали компилятору, что эти переменные должны быть доступны через setter и getter функции, вам нужно определить эти функции. Есть два способа сделать это. Проще всего использовать @synthesize
, добавив следующее к вашей реализации (.файл м):
@synthesize myHeader;
@synthesize customCell;
на @synthesize
строке - myHeader
, - setMyHeader
, - customCell
и - setCustomCell
методы, генерируемые автоматически во время компиляции. Вы также можете определить эти методы вручную, но это обычно не требуется.
вот страница с дополнительной информацией о свойствах в Цель C.
вы объявили @property-это фактически контракт, в котором говорится, что вы будете реализовывать методы getter и setter, но нет. вы должны:
- реализовать
-foo
и-setFoo:
для каждого свойства, или - используйте @synthesize в вашем
.m
файл и компилятор сделают это за вас.
более подробную информацию можно найти в документации здесь.
У вас есть два ivars, определенных в операторах @property, но вам не хватает соответствующего оператора @synthesize. Добавьте @synthesize в определение класса.
у вас есть несколько вариантов, но самый простой и, вероятно, то, что вы хотите, это использовать @synthesize.
В вашей .M файл, где-то после @ реализации, добавить
@synthesize myHeader;
и аналогично для других свойств.
чтобы это работало, ваш класс также должен иметь переменную-член под названием myHeader. Возможно, он уже у тебя. Если нет, то в вашем .h файл, где-то после @interface, поставить
SomeType *myHeader;
конечно, измените "SomeType" на соответствующий тип, который такой же, как у вас в объявлении свойства (то, что у вас есть, что выглядит)
@property (retain) SomeType *myHeader;