gpt4 book ai didi

ios - Objective C 方法和属性可以同名吗?

转载 作者:行者123 更新时间:2023-12-01 17:49:35 25 4
gpt4 key购买 nike

我正在看一个关于 objective C 和 IOS 核心数据的教程,这是我遇到的:

在头文件中:

@interface CoursesTableViewController : UITableViewController <AddCourseViewControllerDelegate,NSFetchedResultsControllerDelegate>

@property (nonatomic,strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic,strong) NSFetchedResultsController *fetchedResultsController;


@end

实现中的一个方法是这样的:

-(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;

}

属性 fetchedResultsController 和实例方法 fetchedResultsController 具有完全相同的名称。

  1. 如何区分这两种方法?
  2. 这有什么特殊的含义吗? (就像方法与类同名意味着它是一个构造函数)

最佳答案

@property 的声明实际上为您创建了三样东西;

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

@property SomeType *someProperty;

将创建一个支持变量(默认称为 _someProperty),一个 setter 方法,如下所示:

-(void) setSomeProperty:(SomeType *)value {
_someProperty=value;
}

还有一个看起来像的getter方法

-(SomeType *)someProperty {
return _someProperty;
}

您可以看到访问“属性”实际上只是方法调用。

编译器知道 myObject.someProperty=someNewValue; 实际上是 [myObject setSomeProperty:someNewValue]myObject.someProperty 实际上是 [myObject someProperty]。事实上,如果您在调试器中单步执行引用属性的行,您将看到执行跳转到属性定义;这是 getter 或 setter 方法的调用。

在您显示的代码中,已明确指定 getter 方法,因此编译器不会像通常那样提供默认实现。在这种情况下,这样可以延迟实例化属性;您会看到代码检查支持变量 _fetchedResultsController 是否不为 nil。如果不是,它只是返回值。如果是,那么它会设置一个新的,将其保存到支持变量并返回它。

当您使用 _propertyName 时,您将绕过 setter/getter。我看到许多程序员这样做是因为他们认为这只是该属性的“速记”,但是正如您从展示的示例中看到的那样,绕过 getter 会导致问题。你应该只在有理由的情况下绕过属性 setter 和 getter 。

您应该绕过 setter 的一个地方是 setter 本身。如果你有

-(void) setSomeProperty:(SomeType *)value {
self.someProperty=value;
}

然后你会得到一个无限循环,因为这段代码真的是

-(void) setSomeProperty:(SomeType *)value {
[self setSomeProperty:value];
}

有趣的是,“getter”语法适用于任何不带参数的非 void 方法,因此 [NSUserDefaults standardUserDefaults] 也可以写成 NSUserDefaults.standardUserDefaults 即使 standardUserDefaults 不是属性。

关于ios - Objective C 方法和属性可以同名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35254537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com