Разница между @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 это будет предупреждение или ошибка.

Если это как-то поможет, я буду рад.

Другие вопросы по тегам