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

时间:2010-11-02 17:43:58

标签: iphone objective-c ios self

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

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

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

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

此规则的两个例外:

  • 任何init方法。
  • dealloc

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

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

答案 2 :(得分:6)

在您的示例中,当您使用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

一般情况下,如果您使用的是属性,则没有理由使用ivar。这具有自动保留和附加功能的附加好处。为你释放价值。

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

答案 3 :(得分:5)

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

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

@interface YourAppDelegate : NSObject <UIApplicationDelegate>
{
@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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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