gpt4 book ai didi

iphone - Xcode 4.5 中@property 和ivar 的区别

转载 作者:技术小花猫 更新时间:2023-10-29 10:40:08 24 4
gpt4 key购买 nike

以前我总是看到像这样使用属性和 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 .

所以上面会变成...

一些类.h

@interface SomeClass : NSObject

@property NSString *someString;

@end

一些类.m

#import "SomeClass.h"

@implementation SomeClass

@end

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

但是,我也看到了……的例子

一些类.h

@interface SomeClass : NSObject

@end

一些类.m

#import "SomeClass.h"

@interface SomeClass () {
NSString *someString;
}

@end

@implementation SomeClass

@end

在这方面,他们只有一个私有(private)的 iVar 而没有 @property

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

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

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

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

谢谢

最佳答案

一般来说,您总是可以使用属性。如果你有“分配”属性,你可以使用 ivar 因为你不需要在你的 getters/setters 中进行任何内存管理。但是,如果您应该保留对象,那么使用 ivar 会很不方便,因为您必须手动保留/释放它们,而属性会为您做这些。

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

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

关于iphone - Xcode 4.5 中@property 和ivar 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12955655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com