我应该什么时候self
在我的 iphone 开发应用程序中使用表达式?假设我有 2 个字段:UITextField *text1;
并NSString *str1;
保留和合成。
当我访问这两个字段中的任何一个时,我应该什么时候以及什么时候不应该使用self.text1
and self.str1
?
我应该什么时候self
在我的 iphone 开发应用程序中使用表达式?假设我有 2 个字段:UITextField *text1;
并NSString *str1;
保留和合成。
当我访问这两个字段中的任何一个时,我应该什么时候以及什么时候不应该使用self.text1
and self.str1
?
self
不是关键字,而是表达式。此外,您可以在任何时候使用它来引用自己或直接引用自己的方法或属性。“你自己”当然是指你正在操作的类的实例。
在某些情况下,通常不鼓励使用 -self.
表达式来访问属性。通常,您 总是 用于 对属性的任何访问。这是最安全和最简单的方式。特别是如果您使用了保留,那么将为您完成内存管理。self
此规则的两个例外:
init
方法。dealloc
.在这两种情况下,您都在处理部分初始化的对象。在这里使用 setter 或 getter 时可能会出现一些副作用——因为它们是方法,因此可能会被覆盖。
例如,获取一个类A
,该类的属性foo
已被类子类化B
。子类B
添加了一个属性bar
并覆盖了foo
. 现在你的init
-method 调用setFoo:
,因为你使用self.foo = ...
了一些初始值。然而,子类也访问bar
这个设置器中的值。但在这种情况下,bar 可能从未被初始化并指向一些任意数据。在 init 中调用 setter 会导致崩溃,尽管在您自己的代码中概率可能不会太高。
在您的示例中,您在使用时不会直接访问实例变量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 以设置它们的值。
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
如果你“综合”变量,你应该“自我”。变量。小经验法则
我对objective-c一无所知,但这看起来很像this
其他语言(如C++、C#、Java、PHP等)的关键字。如果是这样,那么我的建议是始终使用它。这样,如果您曾经(不小心)定义了同名的局部变量,您的代码就不会中断。
但是,我还必须补充一点,这在某种程度上是一场宗教辩论,在程序员社区中有着火热的历史。因此,对这个建议持保留态度,并使用任何对你来说最有意义的东西。只要保持一致。