我什么时候应该使用“self”关键字?

我什么时候应该在我的iphone开发应用程序中使用self表达? 说我有2个字段: UITextField *text1;NSString *str1; 保留和合成。

当我访问这两个字段中的任何一个时,我何时应该何时不应该使用self.text1self.str1

在某些情况下,通常不鼓励使用self. -expression访问属性。 通常,您 总是 使用 self 来访问任何属性。 这是最安全,最简单的方式。 特别是如果您使用retain,那么将为您完成内存管理。

此规则的两个例外:

  • 任何init方法。
  • dealloc

在这两种情况下,您都在处理部分初始化的对象。 在这里使用setter或getter时可能会出现一些副作用 – 因为它们是方法,因此可能会被覆盖。

例如 ,使用属性foo的类A ,该属性已被B类子类化。 子类B添加了一个属性bar并覆盖了foo的setter。 现在你的init -method调用setFoo: ,因为你使用了self.foo = ...并带有一些初始值。 但是,子类也访问此setter中bar的值。 但在这种情况下,可能会发生bar从未被初始化并指向某些任意数据。 在init中调用setter导致崩溃 ,尽管在你自己的代码中概率可能不会太高。

self不是关键字,它是一种表达方式。 此外,您可以在任何时候想要引用自己或您自己的方法或属性时使用它。 通过“你自己”我当然是指你正在操作的类的实例。

在您的示例中,当您使用self时,您不是直接访问实例变量,而是访问您定义的属性。

考虑这个例子:

 @interface Foo : NSObject { NSString *_bar; } @property (nonatomic, retain) NSString *bar; @end @implementation Foo @synthesize bar = _bar; -(void)baz { _bar = @"ivar"; //accessing the ivar self.bar = @"property"; //accessing the ivar via the property } @end 

一般情况下,如果您使用的是物业,那么就没有理由使用这种物品。 这具有为您自动保留和释放价值的额外好处。

但是当您的属性具有readonly修饰符时,存在其他情况。 在这些情况下,有必要直接访问您的ivars以设置其值。

如果你有自定义的getter,有时候在方法调用中使用self也是个好主意。 Core Data-using应用程序中的managedContext对象就是一个很好的例子。 如果您通过self.managedContext引用它, self.managedContext可以覆盖并将对象设置为它需要的值(如果它nil 。 创建使用Core Data的应用程序时,请参阅XCode生成的代码。

以下是XCode生成的代码示例,实际上:

 @interface YourAppDelegate : NSObject  { @private NSManagedObjectContext *managedObjectContext_; } @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @implementation ContractionTimerAppDelegate /** Returns the managed object context for the application. If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. */ - (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext_ != nil) { return managedObjectContext_; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext_ = [[NSManagedObjectContext alloc] init]; [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; } return managedObjectContext_; } @end 

如果你“合成”变量,你应该“自我”。 变量。 小小的经验法则

我对objective-c一无所知,但这看起来很像其他语言的关键字(如C ++,C#,Java,PHP等)。 如果是这样,那么我的建议是始终使用它。 这样,如果您(意外地)定义了具有相同名称的局部变量,您的代码将不会中断。

但是,我还必须补充一点,这是一场宗教辩论,有程序员社区的火焰战争历史。 因此,请谨慎使用这些建议,并使用对你来说最有意义的东西。 只是保持一致。

Interesting Posts