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;

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

  1. в разделе @implementation (в .файл м), вы можете добавить

    @synthesize myHeader, customCell;
    

    чтобы сообщить компилятору автоматически генерировать методы для получения и установите эти свойства. Это самое простое и обычно то, что вы хотите.

  2. вы можете реализовать методы себя так:

    - (SomeClass *)myHeader
    {
        // Return the value of myHeader
    }
    
    - (void)setMyHeader:(SomeClass *)inMyHeader
    {
        // Set myHeader to inMyHeader
    }
    

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

  3. можно использовать @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;