Objective C方法和属性可以具有相同的名称吗?

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都具有完全相同的名称.

  1. 我如何区分这两种方法?
  2. 这有特殊意义吗?(比如方法与类名相同意味着它是一个构造函数)

Pau*_*w11 5

声明a @property实际上是为你创造了三件事;

  1. 用于存储属性的支持变量,
  2. 一个setter方法和
  3. 一种吸气方法.(除非该属性是只读的,在这种情况下没有setter方法).

@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