Разница между @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; 

вы можете получить доступ с "->" только "