9

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

当我访问这两个字段中的任何一个时,我应该什么时候以及什么时候不应该使用self.text1and self.str1

4

6 回答 6

8

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

于 2010-11-02T17:45:36.480 回答
7

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

此规则的两个例外:

  • 任何init方法。
  • dealloc.

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

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

于 2010-11-02T19:03:17.660 回答
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 以设置它们的值。

于 2010-11-02T17:50:10.263 回答
5

self如果您有自定义 getter,有时在方法调用中使用也是一个好主意。使用 Core Data 的应用程序中的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
于 2010-11-02T17:51:59.403 回答
1

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

于 2011-03-09T13:05:00.337 回答
0

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

但是,我还必须补充一点,这在某种程度上是一场宗教辩论,在程序员社区中有着火热的历史。因此,对这个建议持保留态度,并使用任何对你来说最有意义的东西。只要保持一致。

于 2010-11-02T17:48:43.767 回答