@property и @synthesize и ошибки памяти - PullRequest
0 голосов
/ 17 ноября 2011

Я новичок в Objective C и Cocos2D

читаю Особенности использования @property и @synthesize (cocos2d)

Комментарии были ссылками на ошибки в памяти. Что это за ошибки?

В моем коде я использую:

//interface
{
CC_bla_bla *a; 
}
@property(nonatomic, retain) CC_bla_bla *a;


//implementation
@synthesize a;

self.a=[CC_bla_bla load_value:123123]

//dealloc
[self.a release]
self.a = nil;

В классе я всегда использую self.a для всех манипуляций. Это плохо?

А в каком смысле использовать «переменную экземпляра» a?

Ответы [ 3 ]

0 голосов
/ 17 ноября 2011

Свойства только для того, чтобы связать некоторые «метаданные» с вашими переменными, которые будут использоваться при доступе к этому через объект.Директива @synthesize сгенерирует метод получения и установки переменной, используя свойства config.

Например:

self.a = [CC_bla_bla load_value:123123]; // The object is retained because of the property

// This is equivalent to the previous line
[self setA:[CC_bla_bla load_value:123123]];

// ------
// By the same way
self.a;

// is equivalent to
[self a];

// ------
// method generated by your property
- (void)setA:(CC_bla_bla *)newA
{
    [newA retain];
    [a release];
    a = newA;
}

Но если вы используете переменную напрямую, не передавая объектне используйте значение свойства.Например:

a = [CC_bla_bla load_value:123123]; // The object is not retained so you may have unexcepted behaviors

// A good solution
a = [[CC_bla_bla load_value:123123] retain];

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

0 голосов
/ 28 августа 2012

Я думаю, что вы делаете правильно со своим кодом.называйте свою собственность всегда с собой.это хорошо.Но будьте осторожны, ваш код хорош только в том случае, если [CC_bla_bla loadvalue:] не сохраняет созданные объекты.Если ваша функция loadvalue сохранила созданный объект, а свойство снова его сохранит, то оно должно быть дважды освобождено.

0 голосов
/ 17 ноября 2011

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

Так как вы делаете:

@property(nonatomic, retain) CC_bla_bla *a;

Это имеет счет удержания 1, который, как и вы, вы должны выпустить в раздаче. Но, скажем, вы делаете a = [[CC alloc] и т. Д. ... Тогда для него будет сохранено число два.

Надеюсь, вы понимаете это. Вы сами поймете, когда пора использовать свойства.

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