Когда мне следует использовать ключевое слово «self»? - PullRequest
8 голосов
/ 02 ноября 2010

Когда мне следует использовать выражение self в моих приложениях для разработки на iphone? скажем, у меня есть 2 поля: UITextField *text1; и NSString *str1; сохранены и синтезированы.

когда я получаю доступ к любому из этих 2 полей, когда я должен и когда не должен использовать self.text1 и self.str1?

Ответы [ 6 ]

8 голосов
/ 02 ноября 2010

self это не ключевое слово, это выражение.Кроме того, вы используете его в любое время, когда хотите сослаться на метод или свойство на себя или непосредственно.Под «собой» я, конечно, имею в виду экземпляр класса, в котором вы работаете.

7 голосов
/ 02 ноября 2010

В некоторых случаях обычно не рекомендуется использовать выражение self. для доступа к свойству. Обычно вы всегда используете self для любого доступа к собственности. Это самый безопасный и несложный способ.Особенно, если вы использовали retain, то управление памятью будет выполнено за вас.

Два исключения из этого правила:

  • Любой init метод.
  • Вdealloc.

В обоих случаях вы имеете дело с частично инициализированным объектом.Существуют некоторые побочные эффекты, которые могут возникнуть при использовании сеттеров или геттеров, поскольку они являются методами и, следовательно, могут быть переопределены.

Например, , возьмите класс A со свойствомfoo, который был разделен на классы B.Подкласс B добавляет свойство bar и отменяет установщик для foo.Теперь ваш init -метод вызывает setFoo:, потому что вы использовали self.foo = ... с некоторым начальным значением.Однако подкласс также получает доступ к значению bar в этом установщике.Но в этом случае может случиться так, что бар никогда не был инициализирован и указывает на некоторые произвольные данные. Вызов сеттера в init моя причина вылетает , хотя вероятность может быть не слишком высокой в ​​вашем собственном коде.

6 голосов
/ 02 ноября 2010

В вашем примере вы не имеете прямого доступа к переменным экземпляра, когда используете 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.В этих случаях необходим прямой доступ к вашим иварам, чтобы установить их значения.

5 голосов
/ 02 ноября 2010

Также неплохо иногда использовать self в вызове метода, если у вас есть собственный метод получения.Хороший пример - объект managedContext в приложении, использующем базовые данные.Если вы ссылаетесь на него с помощью self.managedContext, вы можете переопределить и установить объект таким, каким он должен быть, если он nil.Обратитесь к коду, сгенерированному XCode при создании приложения, использующего Core Data.

Вот пример кода, сгенерированного 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
1 голос
/ 09 марта 2011

если вы «синтезируете» переменную, вы должны «самостоятельно».переменная.небольшое правило

0 голосов
/ 02 ноября 2010

Я ничего не знаю о target-c, но это похоже на ключевое слово this из других языков (таких как C ++, C #, Java, PHP и другие).Если так, то мой совет - использовать его всегда.Таким образом, если вы когда-нибудь (случайно) определили локальную переменную с тем же именем, ваш код не сломается.

Однако я должен также добавить, что это отчасти религиозная дискуссия с историейпламенные войны в сообществах программистов.Поэтому примите этот совет с долей соли и используйте все, что кажется вам наиболее разумным.Просто будьте последовательны в этом.

...