Xcode iPhone: свойство ... требует определения метода ... для определения - используйте @syntehsize, @dynamic или предоставьте реализацию метода - PullRequest
7 голосов
/ 23 августа 2011

в файле .m У меня есть 4 предупреждения, относящихся к одной команде:

@ end

  • Свойство 'myHeader' требует определения метода '-myHeader'- использовать @synthesize, @dynamic или предоставить реализацию метода

  • Свойство 'customCell' требует определения метода 'setCustomCell:' - использовать @synthesize, @dynamic или предоставить реализацию метода

  • Свойство 'customCell' требует определения метода '-customCell' - используйте @synthesize, @dynamic или предоставьте реализацию метода

  • СвойствоmyHeader требует, чтобы метод setMyHeader был определен - используйте @synthesize, @dynamic или предоставьте реализацию метода

Я просматривал форумы, но пока безнадежен - вы можете объяснитьмне (начинающему программисту ...) как его отладить?Спасибо миллион!

Ответы [ 7 ]

13 голосов
/ 27 февраля 2013

реанимация старой нити.Вероятно, не проблема ОП, но я подумал, что стоит упомянуть об этом, если кто-то еще (как я) столкнется с этим.Вы получаете то же сообщение, если реализуете новое свойство в категории класса (даже удивительно, если вы используете 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
10 голосов
/ 23 августа 2011

Это означает, что вам нужно синтезировать эти переменные.Синтезирование создает методы установки и получения для вас.Для этого вам необходимо включить следующий код в файл вашей реализации (.m):

@synthesize myHeader;
@synthesize customCell;

Добавление этих строк должно устранить ваши 4 ошибки.

У вас также естьвозможность определения методов установки и получения самостоятельно, но если вы не хотите делать что-то конкретное, пока что используйте @synthesize.

7 голосов
/ 23 августа 2011

В заголовке вашего класса (связанный с ним файл .h) у вас, по-видимому, есть что-то похожее на следующее:

@property SomeClass *myHeader;
@property SomeClass *customCell;

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

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

    @synthesize myHeader, customCell;
    

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

  2. Вы можете реализовать методы самостоятельно следующим образом:

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

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

  3. Вы можете использовать @dynamic myHeader, customCell;, чтобы сообщить компилятору, что реализации будут предоставлены во время выполнения.Это редко используется.

3 голосов
/ 23 августа 2011

Использование @property сообщает компилятору, что вы намереваетесь получить доступ к соответствующей переменной-члену через функции "setter" и "getter", то есть функции, которые изменяют значение переменной или возвращают ее значение.Вы видите предупреждения, потому что вы не определили требуемые функции.Я предполагаю, что ваш заголовочный файл (.h) выглядит примерно так:

@property(readwrite, assign) <type> myHeader;
@property(readwrite, assign) <type> customCell;

Поскольку вы сказали компилятору, что эти переменные должны быть доступны через функции setter и getter, вам нужно определить эти функции,Есть два способа сделать это.Самый простой - использовать @synthesize, добавив в файл (.m) следующую реализацию:

@synthesize myHeader;
@synthesize customCell;

Строка @synthesize вызывает - myHeader, - setMyHeader, - customCell и- setCustomCell методы, которые будут сгенерированы автоматически во время компиляции.Вы также можете определить эти методы вручную, но обычно это не требуется.

Вот страница с дополнительной информацией о свойствах в Objective C .

1 голос
/ 23 августа 2011

У вас есть два ивара, определенных в операторах @property, но вам не хватает соответствующего оператора @synthesize. Добавьте @synthesize к определению класса.

0 голосов
/ 23 августа 2011

У вас есть несколько вариантов, но самое простое и, вероятно, то, что вам нужно, это использовать @ synthesize.

В вашем файле .m, где-то после @implementation, добавьте

@synthesize myHeader;

и аналогично для других свойств.

Чтобы это работало, ваш класс также должен иметь переменную-член myHeader. Возможно, у вас уже есть это. Если нет, то в вашем .h файле где-то после @interface поместите

SomeType *myHeader;

Конечно, замените «SomeType» на соответствующий тип, такой же, как у вас в объявлении свойства (то, что у вас есть, похоже)

@property (retain) SomeType *myHeader;
0 голосов
/ 23 августа 2011

Вы объявили @property - это фактически контракт, в котором говорится, что вы реализуете методы getter и setter, но у вас нет. Вам необходимо:

  • реализовать -foo и -setFoo: для каждого свойства или
  • используйте @synthesize в вашем .m файле, и компилятор сделает это за вас.

Более подробную информацию можно найти в документации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...