Не удается синтезировать свойство ‘testjj’ с неполным типом ‘void’

#ios #objective-c

#iOS #objective-c

Вопрос:

Почему я не могу использовать свойство для функции void в заголовке @interface ?

 @property (nonatomic) void testjj;
  

-в m-файле:

 -(void)testjj{
  
  NSLog(@"testjtestj");
  
}
  
 Cannot synthesize property 'testjj' with incomplete type 'void'
  

Комментарии:

1. void не имеет смысла для ivar (или даже переменной). У него нет размера, так как же его вообще хранить. Только функция может быть void, что означает, что она ничего не возвращает, но у вас не может быть переменной nothing.

2. но не обманывайте себя.. @property (nonatomic) void *testjj; возможно — это объявление указателя (но не единственно возможное).

3. Да, да, да — void * или указатель void — замечательная вещь. Оно (обычно) указывает на область выделенной памяти, которую вы можете использовать для чего угодно. Здесь пустая часть очень мощная, поскольку вы не ограничены, например, указателем на целые числа, символы или объекты. Итак, у вас есть эта обобщенная область памяти, и вы можете, например, написать функцию, чтобы сохранить ее на диск и восстановить позже. Здесь это имеет такой смысл, поскольку вы, вероятно, использовали бы один и тот же код, будь то int или char или objects или что-то еще, а void * дает вам свободу делать такие общие вещи. Но только void — не так много …

4. Просто подумайте об этом — предположим, у вас есть переменная void. Каким будет его значение? Сможете ли вы его изменить, и если да, то на что? Если вы его напечатаете, что он будет печатать? Ни одно из них не имеет никакого смысла. Void на самом деле — это прозвище, которое одновременно ничего или ничего не означает. Если используется само по себе, это ничего не значит. Функция, которая ничего не возвращает, является функцией void. Функция, которая не принимает аргументов, принимает аргументы void. Указатель Void означает, что он указывает на что-либо. Указатель void может быть указателем на int или float или char или объекты. Таким образом, void также имеет эту двойственность.

Ответ №1:

Комментарии касаются объявления переменной void как ivar. В комментариях также немного уточняется разница между void и void pointer. Это важно.

Кажется, вы хотите иметь ivar, который, по сути, является функцией void. Это, конечно, возможно, если вы используете указатель void, а не void, как показано ниже.

 // A few functions for later
void f1( int a, int b )
{
    NSLog(@"f1");
}

void f2( int a, int b )
{
    NSLog(@"f2");
}

void F1( void )
{
    NSLog(@"F1");
}

void F2( void )
{
    NSLog(@"F2");
}

// Typedef makes life easy
typedef void ( func )( int a, int b );
typedef void ( Func )( void );

// Some class
@interface MyClass : NSObject

// Defining ivars ...

// Typedef is easier
@property (nonatomic) func * ma;
@property (nonatomic) Func * mb;

// Direct is also possible
@property (nonatomic) void ( * na )( int, int );
@property (nonatomic) void ( * nb )( void );

@end

@implementation MyClass

// Assigning the ivars
- ( void ) setIt
{
    self.ma = f1;
    self.mb = F1;

    self.na = f2;
    self.nb = F2;
}

// 'Using' the ivars
- ( void ) doIt
{
    self.ma ( 1, 2 );
    self.mb ();

    self.na ( 1, 2 );
    self.nb ();
}

// Have some fun
- ( void ) swapIt
{
    func * t1 = self.ma;
    Func * t2 = self.mb;

    self.ma = self.na;
    self.mb = self.nb;

    self.na = t1;
    self.nb = t2;
}

@end
  

Ответ №2:

в .h

 - (void)testjj;
  

в .m

 self.testjj;
  

Это нормально.