har*_*ash 1 properties objective-c ios
我正在查看关于目标C和IOS的核心数据的教程,这是我遇到的:
在头文件中:
@interface CoursesTableViewController : UITableViewController <AddCourseViewControllerDelegate,NSFetchedResultsControllerDelegate>
@property (nonatomic,strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic,strong) NSFetchedResultsController *fetchedResultsController;
@end
Run Code Online (Sandbox Code Playgroud)
并且实现中的方法具有:
-(NSFetchedResultsController *)fetchedResultsController{
if(_fetchedResultsController!=nil){
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Course" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Specify criteria for filtering which objects to fetch
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"author" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"author" cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)
属性fetchedResultsController和一个实例方法fetchedResultsController都具有完全相同的名称.
声明a @property实际上是为你创造了三件事;
@property SomeType *someProperty;
将创建一个后备变量(_someProperty默认调用),一个看起来像的setter方法:
-(void) setSomeProperty:(SomeType *)value {
_someProperty=value;
}
Run Code Online (Sandbox Code Playgroud)
还有一个看起来像的getter方法
-(SomeType *)someProperty {
return _someProperty;
}
Run Code Online (Sandbox Code Playgroud)
您可以看到访问"属性"实际上只是方法调用.
编译器知道myObject.someProperty=someNewValue;实际上是[myObject setSomeProperty:someNewValue]和myObject.someProperty是真的[myObject someProperty].实际上,如果单步执行引用调试器中的属性的行,您将看到执行跳转到属性定义; 这是getter或setter方法的调用.
在您显示的代码中,已明确指定了getter方法,因此编译器将不提供它通常会提供的默认实现.在这种情况下,这样就可以懒惰地实例化属性; 你看到代码检查后备变量_fetchedResultsController是不是nil.如果不是,它只是返回值.如果是,则设置一个新的,将其保存到支持变量并返回它.
当你使用时,_propertyName你绕过了setter/getter.我看到许多程序员这样做是因为他们认为这只是属性的"简写",但正如你从示例中看到的那样,绕过getter会导致问题.只有在有原因时才应绕过属性设置器和getter.
你应该绕过setter的地方就是setter本身.如果你有
-(void) setSomeProperty:(SomeType *)value {
self.someProperty=value;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个无限循环,因为这段代码确实如此
-(void) setSomeProperty:(SomeType *)value {
[self setSomeProperty:value];
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,'getter'语法适用于任何不带参数的非void方法,因此即使不是属性[NSUserDefaults standardUserDefaults]也可以写入.NSUserDefaults.standardUserDefaultsstandardUserDefaults
| 归档时间: |
|
| 查看次数: |
925 次 |
| 最近记录: |