jam*_*mes 8 iphone objective-c self ios
我何时应该self在我的iphone开发应用程序中使用该表达式?说我有2个领域:UITextField *text1;并NSString *str1;保留和合成.
当我访问这两种2场的时候,我应该什么时候应该我不使用self.text1和self.str1?
self不是关键字,它是一个表达式.此外,您可以在任何时候想要引用自己或您自己的方法或属性时使用它.通过"你自己"我当然是指你正在操作的类的实例.
在某些情况下,通常不鼓励使用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会导致崩溃,尽管在您自己的代码中概率可能不会太高.
在您的示例中,您不是在使用时直接访问实例变量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以设置其值.
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)
| 归档时间: |
|
| 查看次数: |
4710 次 |
| 最近记录: |