我什么时候应该使用"self"关键字?

jam*_*mes 8 iphone objective-c self ios

我何时应该self在我的iphone开发应用程序中使用该表达式?说我有2个领域:UITextField *text1;NSString *str1;保留和合成.

当我访问这两种2场的时候,我应该什么时候应该我不使用self.text1self.str1

jer*_*jer 8

self不是关键字,它是一个表达式.此外,您可以在任何时候想要引用自己或您自己的方法或属性时使用它.通过"你自己"我当然是指你正在操作的类的实例.

  • 一个重要的区别是`self.str1 = @"abc"`将使用访问器方法(`setStr1:`)但是`str1 = @"abc"`将不会.使用带有"retain"属性的属性时,这种差异至关重要.所以,它真的不是"与Java`相同". (12认同)

Max*_*ann 7

在某些情况下,通常不鼓励使用self.-expression访问属性.通常,您 始终可以 使用 任何财产.这是最安全,最简单的方式.特别是如果您使用retain,那么将为您完成内存管理.self

此规则的两个例外:

  • 任何init方法.
  • dealloc.

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

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


Ben*_*man 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
Run Code Online (Sandbox Code Playgroud)

一般来说,如果你使用的是物业,那么就没有理由使用这种物品.这具有为您自动保留和释放价值的额外好处.

但是当您的属性具有readonly修饰符时,存在其他情况.在这些情况下,有必要直接访问您的ivars以设置其值.


lew*_*uez 5

self如果您有自定义的getter,有时在方法调用中使用也是个好主意.managedContextCore Data-using应用程序中的对象就是一个很好的例子.如果你引用它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
Run Code Online (Sandbox Code Playgroud)