2015-02-12 4 views
3

Я новичок в Objective CПредоставляет ли Objective-C использование структур?

Я попытался с помощью простой struct и получил

arc forbids objective-c objects in struct 

Looking up ARC, похоже, это спецификация, которая определяет Objective C syntaxt - это правильно?

Во-вторых, как я могу использовать struct, если это не разрешено?

Спасибо!

Редактировать: Часть кода в качестве образца

@implementation Cities { 
    // The goal is to have a struct that holds information about a city, 
    // like when a person started and ended living there. 
    // I was trying to make this struct an instance variable of the Cities 
    // class 
    // XCode doesn't like the below struct definition 

    struct City 
    { 
     NSString *name; 
     int *_startYear; 
     int *_endYear; 
    }; 
} 
+0

Показать код, для чего вам нужна структура? – Wain

+0

Нет конкретной причины прямо сейчас, я просто играю с образцами кода и задаюсь вопросом, почему я получаю вышеуказанную ошибку при использовании 'struct'. Если это нецелесообразно использовать, это нормально, я не буду использовать его надолго. Меня больше интересует * почему * это бросает эту ошибку. Благодаря! – user2490003

+0

Я не помню точной причины, вы можете использовать structs, просто не ставьте указатели на экземпляры классов в них. – Wain

ответ

8

дуга запрещает Objective-C объектов в структуры

Структуры представляют собой С конструкцией. Компилятор говорит вам, в очень недвусмысленных выражениях, что вы не можете иметь объекты Objective-C внутри структуры, а не то, что структуры являются незаконными.

Вы можете использовать обычные C-структуры, которые вы хотите.

Ваш пример пытается помещать ссылки на объект Objective-C, NSString, в struct, что несовместимо с ARC.

Структуры обычно используются для простых структур данных. Примеры, с которыми вы столкнетесь в коде Objective-C, - CGPoint и CGRect.

CGPoint выглядит что-то вроде этого

struct CGPoint 
{ 
    CGFloat x; 
    CGFloat y; 
}; 

A CGFloat, я думаю, просто double, и идея его, чтобы представить точку в 2D пространстве. Структуры могут включать указатели на другие структуры, C-массивы и стандартные типы данных C, такие как int, char, float ... И классы Objective-C могут содержать структуры, но обратное не работает.

Структуры также могут быть довольно сложными, но это очень широкая тема, которая лучше всего исследуется с помощью Google.

+0

Ум, определяющий, что такое регулярная структура C? Я тоже не знаком с C :) Я добавил фрагмент кода к вопросу, хотя это помогает понять, что я пытаюсь сделать. Благодаря! – user2490003

+0

Это имеет смысл! Еще одно - и жаль, что я здесь плотный. Я получаю, что объекты Objective C не могут быть в структуре, поэтому мое определение NSString недействительно. Но ваша структура содержит CGFloat - это не объект Objective C? – user2490003

+0

CGFloat - это всего лишь typedef для float_32, я думаю, не уверен – Bhargav

8

Вы можете использовать struct в Objective-C++ с ARC в любом случае.

#import <Foundation/Foundation.h> 

@interface City : NSObject 
struct Data { 
    NSString *name; 
}; 

@property struct Data data; 
@end 

@implementation City 
@end 

int main() 
{ 
    City *city = [[City alloc] init]; 
    city.data = (struct Data){@"San Francisco"}; 
    NSLog(@"%@", city.data.name); 
    return 0; 
} 

Если вы скомпилируете его как Objective-C, вы потерпели неудачу, как вы сказали.

$ clang -x objective-c -fobjc-arc a.m -framework Foundation 
a.m:5:15: error: ARC forbids Objective-C objects in struct 
    NSString *name; 
      ^
1 error generated. 

Поскольку C struct не имеет возможности управления для переменной продолжительности жизни.

Но в C++ структура имеет функцию деструктора. Таким образом, структура C++ совместима с ARC.

$ clang++ -x objective-c++ -fobjc-arc a.m -framework Foundation 
$ ./a.out 
San Francisco 
1

Если вы хотите использовать структуры в Objective C (с ARC) используйте "__unsafe_unretained" атрибут.

struct Address { 
    __unsafe_unretained NSString *city; 
    __unsafe_unretained NSString *state; 
    __unsafe_unretained NSString *locality; 
}; 
Смежные вопросы