Jak*_*kub 48 objective-c getter-setter ios synthesize
使用下划线并self在调用时使用Objective-C中的关键字是否有区别@property?
财产申报:
@property (weak, nonatomic) NSString *myString;
Run Code Online (Sandbox Code Playgroud)
致电@synthesize酒店:
@synthesize myString = _myString;
Run Code Online (Sandbox Code Playgroud)
如果我想在我的代码中使用它,是否有区别?什么时候?在getter/setter中?
self.myString = @"test";
_myString = @"test";
Run Code Online (Sandbox Code Playgroud)
Amy*_*all 74
self.myString = @"test";完全等同于写作[self setMyString:@"test"];.这两个都在调用一种方法.
您可以自己编写该方法.它可能看起来像这样:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
Run Code Online (Sandbox Code Playgroud)
因为你使用过@synthesize,所以你不必费心去编写那个方法,你可以让编译器为你编写它.
因此,通过查看该方法,看起来调用它将完成与为实例变量赋值完全相同的事情,对吧?嗯,这不是那么简单.
首先,您可以编写自己的setter方法.如果这样做,您的方法将被调用,它可以执行各种其他操作以及设置变量.在这种情况下,使用self.myString =会调用您的方法,但不会这样做_myString =,因此将使用不同的功能.
其次,如果您使用Key Value Observing,编译器会做一些非常聪明的技巧.在幕后,它会对您的类进行子类化,并覆盖您的setter方法(无论是您自己编写的还是通过合成生成的方法),以便willChangeValueForKey:对Key Value Observing进行调用.你不需要知道它是如何工作的(尽管如果你想要睡前阅读它会很有趣!),但是你需要知道如果你想要Key Value Observing自动工作,你必须使用setter方法.
第三,即使你依靠合成写一个方法,调用setter方法也可以为将来提供灵活性.您可能希望在更改值时执行额外操作,并且在您发现要执行此操作时,您可以手动编写setter方法 - 如果您习惯于始终使用self.myString =,那么您将不需要更改代码的其余部分以开始调用新方法!
第四,这同样适用于子类.如果其他人要对您的代码进行子类化,那么如果您使用setter,那么他们可以覆盖它们来调整功能.
无论何时直接访问实例变量,您都明确没有提供在此时挂钩额外功能的方法.由于您或其他人可能希望在将来使用此类功能,因此除非有充分的理由不这样做,否则始终使用设置者是值得的.
你是对的 - 第一个版本(self.myString)调用合成的getter/setter,第二个版本直接访问私有成员变量.
看起来你正在使用ARC,所以在这种情况下它并没有那么大的差别.但是,如果您不使用ARC,则可能会有所不同,因为直接分配给私有成员不会触发使用为您生成的自动保留/释放或复制/释放逻辑synthesize.
| 归档时间: |
|
| 查看次数: |
21093 次 |
| 最近记录: |