我应该何时在iphone开发应用程序中使用self
表达式?说我有2个字段:UITextField *text1;
和NSString *str1;
保留并合成。
当我访问这两个字段中的任何一个时,我何时应该何时不使用self.text1
和self.str1
?
答案 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等)。如果是这样,那么我的建议是始终使用它。这样,如果您(偶然)定义了具有相同名称的局部变量,则代码不会中断。
但是,我还必须补充一点,这是一场有关程序员社区火焰战争历史的宗教辩论。因此,请谨慎使用这些建议,并使用对你来说最有意义的东西。只是保持一致。