Разница между @property и ivar в Xcode 4.5
Ранее я всегда видел пример использования свойств и iVars, как это...
Внутри SomeClass.h
@interface SomeClass : NSObject {
NSString *_someString;
}
@property NSString *someString;
@end
Тогда в SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@synthesize someString = _someString;
@end
Совсем недавно (в видео WWDC 2012) я слышал, что нам больше не нужно @synthesize
и рекомендуется просто использовать @property
без связанного iVar.
Таким образом, вышеизложенное изменится на...
SomeClass.h
@interface SomeClass : NSObject
@property NSString *someString;
@end
SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@end
Это просто с помощью @property
и нет ивара. Это имеет смысл, и я им пользуюсь.
Тем не менее, я также видел примеры...
SomeClass.h
@interface SomeClass : NSObject
@end
SomeClass.m
#import "SomeClass.h"
@interface SomeClass () {
NSString *someString;
}
@end
@implementation SomeClass
@end
В этом у них просто есть личное iVar
и нет @property
,
Так в чем же разница? Я понимаю что @property
также предоставляет методы доступа, но вам не нужно переопределять методы доступа. Вы можете просто использовать средства доступа по умолчанию.
Так, когда бы вы использовали @property, а не ivar, и когда вы бы использовали только ivar, а не @property
? И почему бы вам не избавиться от иваров полностью и не использовать @properties
? Если они должны быть приватными, просто используйте их внутри расширения интерфейса в .m.
Быстрое редактирование в ответ на ответ об управлении памятью. Я использую ARC, и мне кажется, что я могу лучше контролировать управление памятью с помощью strong
а также weak
@properties
чем я делаю с использованием iVars.
Надеюсь, вопрос достаточно ясен.
Спасибо
2 ответа
В общем, вы всегда можете использовать свойства. Если у вас есть свойство "assign", вы можете использовать ivar, потому что вам не нужно управлять памятью в ваших методах получения / установки. Но если вам нужно сохранить объекты, использовать ivars просто неудобно, потому что вы должны вручную сохранять / освобождать их, пока свойства делают это за вас.
Также, если вы используете ivars, у вас нет контроля над настройкой / получением значений. В целом, использование публичных полей вместо методов получения или установки является плохой практикой. Например, это не нормально, если вы можете установить отрицательное значение для поля, в котором хранится возраст человека.
И вы не можете использовать KVO с ivars
Я думаю, это зависит от того, что у вас есть доступ к публичным иварам с "->
"Синтаксис. Возможно, ранее, если вы объявите свойство только для чтения без @private
ivar вы можете получить к нему доступ с помощью "->
msgstr "синтаксис. (может быть, это нарушает инкапсуляцию).
Но теперь, если вы объявите что-то вроде этого
{
@private NSArray *a;
@protected NSArray *b;
@public NSArray *c;
}
@property (nonatomic, retain) NSArray *d;
Вы можете получить доступ с "->
" только для того, чтобы "c
"ivar, просто попробуйте этот код. с a, b и d это будет предупреждение или ошибка.
Если это как-то поможет, я буду рад.