12

以前我总是看到像这样使用属性和 iVar 的例子......

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。

所以上面会变成...

一些类.h

@interface SomeClass : NSObject

@property NSString *someString;

@end

SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@end

这只是使用@property并且没有 ivar。这是有道理的,我一直在使用它。

但是,我也看到了一些例子......

一些类.h

@interface SomeClass : NSObject

@end

SomeClass.m

#import "SomeClass.h"

@interface SomeClass () {
    NSString *someString;
}

@end

@implementation SomeClass

@end

在这方面,他们只有一个私人的iVar,没有@property

那么有什么区别呢?我知道这也@property提供了访问器方法,但您不必重写访问器方法。您可以只使用默认访问器。

那么什么时候你会使用 @property 而不是 ivar,什么时候你会只使用 ivar 而不是 a @property?你为什么不完全摆脱 ivars 而只是使用@properties呢?如果它们需要是私有的,那么只需在.m的接口扩展中使用它们。

快速编辑以响应有关内存管理的答案。strong我正在使用 ARC,对我来说,使用和weak @properties使用 iVar 时我似乎可以更好地控制内存管理。

我希望这个问题足够清楚。

谢谢

4

2 回答 2

2

通常,您始终可以使用属性。如果您有“分配”属性,您可以使用 ivar,因为您不需要在 getter/setter 中进行任何内存管理。但是,如果您应该保留对象,那么使用 ivars 是不方便的,因为您必须手动保留/释放它们,而属性会为您执行此操作。

此外,如果您使用 ivars,您将无法控制设置/获取值。一般来说,使用公共字段而不是 getter 或 setter 是一种不好的做法。例如,如果您可以为存储人员年龄的字段设置负值,则不可以。

而且您不能将 KVO 与 ivars 一起使用

于 2012-10-18T13:24:38.943 回答
-1

我认为这取决于您可以使用“ ->”语法访问公共 ivars 的事实。也许以前,如果你声明一个没有@privateivar 的只读属性,你可以使用 " ->" 语法访问它。(也许它打破了封装)。

但是现在如果你声明这样的东西

{
@private NSArray *a;
@protected NSArray *b;
@public NSArray *c;
}
@property (nonatomic, retain) NSArray *d; 

您只能使用“ ->”访问“ c” ivar,只需尝试此代码。使用 a,b 和 d 将是警告或错误。

如果它有帮助,我会很高兴。

于 2012-10-18T13:59:05.933 回答