неясное использование @property в оконном приложении с использованием основных данных - PullRequest
0 голосов
/ 28 апреля 2010

Просматривая приложение на основе окна, с которым я экспериментировал, чтобы осваивать основные данные, я заметил, что приложение appdelegate имеет следующий код

myAppDelegate.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface myAppDelegate : NSObject <UIApplicationDelegate> {


NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;       
NSPersistentStoreCoordinator *persistentStoreCoordinator;

UIWindow *window;
UITabBarController *tabBarController;

}

myAppDelegate.m

#import "myAppDelegate.h"


@interface myAppDelegate (PrivateCoreDataStack)
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@end

@implementation myAppDelegate

@synthesize window, tabBarController;

// code ....

// 
- (NSManagedObjectContext *) managedObjectContext {
}
- (NSManagedObjectModel *)managedObjectModel {
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
}

// etc.....

Я хочу понять несколько вещей о том, что делает этот проект

  1. почему свойства в объявлении категории? (если я удаляю категорию privateCoreDataStack, все по-прежнему работает ...)
  2. почему свойства кажутся связанными с методами в реализации ... managedObjectContext {} etc
  3. почему члены в файле .h имеют то же имя, что и свойства и методы
  4. почему завершение кода позволяет мне использовать точку '.' получить доступ к членам, но затем не удается при компиляции сказать, что он не может найти получатель

спасибо!

1 Ответ

1 голос
/ 28 апреля 2010

Это основные понятия в Objective-C, но вот краткое изложение:

Члены экземпляра обычно считаются частными, и вам никогда не следует обращаться к членам экземпляра других объектов, кроме как через средства доступа. Отсюда необходимость в

объявления свойств подобны определениям методов; @property (…, readonly) NSManagedObjectModel *managedObjectModel; - это , в основном , то же самое, что и - (NSManagedObjectModel *)managedObjectModel;, за исключением того факта, что он допускает точечную запись.

Категория используется, чтобы скрыть эти средства доступа от пользователей класса (по любой причине); отсюда и название PrivateCoreDataStack. Категория - причина, по которой дот-нотация работает; если вы удалите его, он не будет.

Что касается имен; имена методов и имена членов экземпляров живут в отдельных пространствах имен; это означает, что они могут иметь одинаковое имя; это очень удобно, потому что говорит вам, что - (id)somePropery; доступ id someProperty;; или что @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; обращается NSManagedObjectContext *managedObjectContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...