Fog*_*ter 12 iphone properties ios ivars
以前我一直看到使用属性和iVars这样的例子......
在SomeClass.h里面
@interface SomeClass : NSObject {
NSString *_someString;
}
@property NSString *someString;
@end
Run Code Online (Sandbox Code Playgroud)
然后在SomeClass.m中
#import "SomeClass.h"
@implementation SomeClass
@synthesize someString = _someString;
@end
Run Code Online (Sandbox Code Playgroud)
最近(在WWDC 2012视频中)我听说我们不再需要@synthesize它,建议只使用@property没有它的相关iVar.
所以上面会变成......
SomeClass.h
@interface SomeClass : NSObject
@property NSString *someString;
@end
Run Code Online (Sandbox Code Playgroud)
SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@end
Run Code Online (Sandbox Code Playgroud)
这只是使用@property和没有ivar.这是有道理的,我一直在使用它.
但是,我也看过......的例子
SomeClass.h
@interface SomeClass : NSObject
@end
Run Code Online (Sandbox Code Playgroud)
SomeClass.m
#import "SomeClass.h"
@interface SomeClass () {
NSString *someString;
}
@end
@implementation SomeClass
@end
Run Code Online (Sandbox Code Playgroud)
在这个他们只有一个私人iVar和没有@property.
那有什么区别?我知道它也@property提供了访问器方法,但您不必重写访问器方法.您可以使用默认访问者.
所以你什么时候才能使用@property而不是ivar @property?什么时候才能使用ivar而不是?你为什么不完全摆脱伊娃,只是使用@properties?如果它们需要是私有的,那么只需在.m中的接口扩展中使用它们.
快速编辑以响应有关内存管理的答案.我正在使用ARC,对我来说,似乎我可以更好地控制使用内存管理,strong而weak @properties不是使用iVars.
我希望这个问题足够清楚.
谢谢
一般来说,您始终可以使用属性。如果你有“分配”属性,你可以使用 ivar 因为你不需要在 getter/setter 中进行任何内存管理。但是,如果您应该保留对象,那么使用 ivars 就很不方便,因为您必须手动保留/释放它们,而属性会为您执行此操作。
另外,如果您使用 ivars,您将无法控制设置/获取值。一般来说,使用公共字段而不是 getter 或 setter 是一种不好的做法。例如,如果您可以为存储人员年龄的字段设置负值,那就不行了。
而且你不能将 KVO 与 ivars 一起使用
| 归档时间: |
|
| 查看次数: |
5490 次 |
| 最近记录: |