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