2010-11-02 4 views
8

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

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

ответ

7

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

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

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

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

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

8

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

+1

, так что оно похоже на выражение Java 'this', которое не всегда требуется, если не имеет дело с переменными с тем же именем. – binnyb

+0

Вы верны. –

+12

Важным отличием является то, что 'self.str1 = @" abc "' будет использовать метод accessor ('setStr1:'), но 'str1 = @" abc "' не будет. При использовании свойств с атрибутом 'Сохранить' это различие имеет решающее значение. Таким образом, это действительно не «идентично Java' this' ». –

0

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

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

+0

Но обратите внимание, что это не просто проблема стиля/ремонтопригодности в объекте-С - при использовании свойства, которое имеет методы getter/setter, опустив «self», обходит геттер/сеттер; есть реальная смысловая разница. –

+0

это именно то, что я искал, хороший – binnyb

+0

@ Давид Гельхар - извините. Сказал, что я не знал. : P –

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 

В общем, если вы используете свойства, есть мало оснований использовать Ивара. Это дает дополнительное преимущество, автоматически сохраняя значения &.

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

+0

Я в замешательстве. Где объявлено _foo и foo? Должны ли они быть баром и баром в вашем базовом методе? –

+0

Извините, я сделал опечатку в своем собственном примере. исправленный –

5

Также полезно использовать self в вызове метода, если у вас есть пользовательский геттер. Хорошим примером является объект managedContext в приложении Core Data. Если вы ссылаетесь на него на self.managedContext, вы можете переопределить и установить объект в том, что ему нужно, если это nil. Обратитесь к коду, создаваемому 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 
1

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

Смежные вопросы