ios - ivar 有两种不同的行为方式,但用法相同

标签 ios objective-c xcode core-data

我尝试了 2 个不同的应用程序来测试一些东西。

第一个应用程序很简单

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    NSMutableString *text;
}
@property (nonatomic, retain)NSMutableString *text;
@end

ViewController.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize text = text;
- (void)viewDidLoad
{
    [super viewDidLoad];
    text = @"FOO";
    NSLog(@"%@", text);
    self.text = @"FOO2";
    NSLog(@"%@", self.text);
    NSLog(@"1:%@ - 2:%@", text, self.text);
}

这使得事物看起来像是用相同的名称合成的,使它们成为相同的变量。因为它打印出这个:

2013-09-05 11:20:14.527 testIvar[12965:c07] FOO
2013-09-05 11:20:14.528 testIvar[12965:c07] FOO2
2013-09-05 11:20:14.529 testIvar[12965:c07] 1:FOO2 - 2:FOO2

即使我使用 %p 打印 text 和 self.text 的地址内存,我也会得到相同的地址

*我的其他应用测试是这个*

AppDelegate.h

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSManagedObjectContext *managedObjectContext;
    NSManagedObjectModel *managedObjectModel;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

}

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@property ( strong, nonatomic ) UINavigationController *navigationController;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "MasterViewController.h"

@implementation AppDelegate

@synthesize managedObjectContext = managedObjectContext;
@synthesize managedObjectModel = managedObjectModel;
@synthesize persistentStoreCoordinator = persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    MasterViewController *masterVC = [[MasterViewController alloc]initWithNibName:@"MasterViewController" bundle:nil];
    masterVC.MOC = managedObjectContext;

    self.navigationController = [[UINavigationController alloc]initWithRootViewController:masterVC];

    [self.window setRootViewController:self.navigationController];



    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

如果我这样做,这个应用程序将无法运行

masterVC.MOC = managedObjectContext;

但只有我这样做才有效

masterVC.MOC = self.managedObjectContext;

即使我打印了 ManagedObjectContext 和 self.managementObjectContext 的内存地址 我得到 2 个不同的地址

这怎么可能? 2 个不同的应用程序中的相同内容,有 2 种不同的行为方式?!?!?!?!?!?!?!?!?

最佳答案

masterVC.MOC = self.managementObjectContext; 仅在这种情况下有效,因为 getter 方法已被重写。

仔细看你会发现,在你的AppDelegate中,有一个方法

- (NSManagedObjectContext *)managedObjectContext

当您通过 self 引用该对象时,将调用重写的 getter 方法。

关于ios - ivar 有两种不同的行为方式,但用法相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18633346/

相关文章:

ios - 如何在我的网站中关闭自动 sleep ios

ios - 无法识别的选择器发送到实例 Swift 2.1

ios - UICollectionView-基于核心数据一对多关系的节和行

xcode - swift 2 : Function counting occurrence in string not working

ios - 按下图像按钮时添加声音

javascript - 语法错误 : Unexpected token, 应为 ", "

ios - 是否有 API 可以告诉谁取消了他们的应用内购买?

objective-c - 如何在 swift 中导入 <sys/utsname.h>

iOS 自动布局约束 : ignore hidden or zero-size view?

ios - 如何在构建时将每个目标 UIAppFonts 添加到共享的 Info.plist 文件