iOS-继承是如何工作的?

iOS-继承是如何工作的?,ios,inheritance,setter,getter,Ios,Inheritance,Setter,Getter,我实际上试图弄清楚Objective-C中的继承是如何工作的。我的问题是,我的目标。allways返回“null” 这是我的密码: 编辑:添加了代码的其余部分 // ReportViewController.h #import <UIKit/UIKit.h> #import <MessageUI/MessageUI.h> #import "IAPHelper.h" @class Report, Category, GADBannerView; @interfac

我实际上试图弄清楚Objective-C中的继承是如何工作的。我的问题是,我的目标。allways返回“null”

这是我的密码:

编辑:添加了代码的其余部分

//  ReportViewController.h


#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import "IAPHelper.h"

@class Report, Category, GADBannerView;

@interface ReportViewController : UIViewController <UIWebViewDelegate,     
NSFetchedResultsControllerDelegate> {NSString* _werbung;}

@property (nonatomic, strong) GADBannerView *bannerView;
@property (nonatomic, retain) NSString* werbung;

- (id)initWithReport:(Report *)report category:(Category *)category ;

@end


//  ReportViewController.m

#import "ReportViewController.h"
#import "IAPHelper.h"

@interface ReportViewController ()
- (void)loadReport;
- (void)setupFetchRequest;
- (void)resizeNavigationContentViewToHeight:(CGFloat)height;
- (NSString*) werbung;
- (void)setWerbung:(NSString *)newwerbung;
@end

@implementation ReportViewController
@synthesize werbung = _werbung;

-(NSString*) werbung {
return _werbung;
}

- (void)setWerbung:(NSString *)newwerbung {
_werbung= newwerbung;
}

//Werbung ausblenden
NSLog(@"Check for bought products");
if ([_werbung isEqual: @"gekauft"]) {
    self.bannerView.hidden = TRUE;
}


- (void)viewDidLoad
{
[super viewDidLoad];

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{

         self.edgesForExtendedLayout=UIRectEdgeNone;
        self.navigationController.navigationBar.translucent = NO;


}

//ADMob

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
     if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
         _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(20.0,850.0,728,90 )];}
 if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) {
     _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(-10,615.0,728,90 )];}
     if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft) {
         _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(-10,615.0,728,90 )];}
     }
else
    _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(0,410,320,50 )];
//initWithAdSize:kGADAdSizeBanner];
//initwithframe:CGRectMake(0.0,0.0,320,50 )];

self.bannerView.adUnitID = @„xxxxxxxxxxxxxxxxx“;
self.bannerView.rootViewController = self;
GADRequest *request = [GADRequest request];
// Enable test ads on simulators.
[self.view addSubview:(_bannerView)];
request.testDevices = @[ GAD_SIMULATOR_ID, @„xxxxxxxxxxxxxxxxxxxxxxx“ ];
[self.bannerView loadRequest:request];

   //Werbung ausblenden
   NSLog(@"Check for bought products");
    if ([_werbung isEqual: @"gekauft"]) {
    self.bannerView.hidden = TRUE;
}

NSLog(@"%@",_werbung);
NSLog(@"%@",self.werbung);
}





//  IAPHelper.m
#import "IAPHelper.h"
#import <StoreKit/StoreKit.h>
#import "ReportViewController.h"

@interface IAPHelper () <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end

@implementation IAPHelper

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers
{
//self = [super init];
if ((self = [super init])) {

    // Store product identifiers
    _productIdentifiers = productIdentifiers;
    // Check for previously purchased products
    _purchasedProductIdentifiers = [NSMutableSet set];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    for (NSString * productIdentifier in _productIdentifiers) {
        BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
        if (productPurchased) {
            [_purchasedProductIdentifiers addObject:productIdentifier];
            NSLog(@"Previously purchased: %@", productIdentifier);

            if ([productIdentifier isEqual:@"XXXXXXXXXXXXXXXXXXXXXXXXXX"]) {

              ReportViewController *rvc = [[ReportViewController alloc] init];
              rvc.werbung  = @"gekauft";


                NSLog(@"werbung gekauft!");
                NSLog(@"%@", rvc.werbung);     <- log's @"gekauft";
                } else {
            NSLog(@"Not purchased: %@", productIdentifier);
        }
        }
 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    }}
    return self;
 }
//ReportViewController.h
#进口
#进口
#导入“IAPHelper.h”
@课堂报告,分类,GadbanerView;
@接口ReportViewController:UIViewController{NSString*\u werbung;}
@属性(非原子,强)GadbanerView*bannerView;
@属性(非原子,保留)NSString*werbung;
-(id)initWithReport:(报告*)报告类别:(类别*)类别;
@结束
//ReportViewController.m
#导入“ReportViewController.h”
#导入“IAPHelper.h”
@接口ReportViewController()
-(作废)装货报告;
-(无效)请求;
-(void)resizeNavigationContentViewToHeight:(CGFloat)高度;
-(NSString*)werbung;
-(无效)setWerbung:(NSString*)newwerbung;
@结束
@实现报告视图控制器
@合成werbung=_werbung;
-(NSString*)werbung{
返回werbung;
}
-(无效)setWerbung:(NSString*)newwerbung{
_werbung=newwerbung;
}
//奥斯布伦登酒店
NSLog(“检查购买的产品”);
如果([[u werbung isEqual:@“gekauft]”){
self.bannerView.hidden=TRUE;
}
-(无效)viewDidLoad
{
[超级视图下载];
如果([[[UIDevice currentDevice]systemVersion]floatValue]>=7.0)
{
self.edgesForExtendedLayout=UIRectEdgeNone;
self.navigationController.navigationBar.translucent=否;
}
//ADMob
if([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad){
if([UIApplication sharedApplication].StatusBaroOrientation==UIInterfaceOrientationPortrait){
_bannerView=[[GADBannerView alloc]initWithFrame:CGRectMake(20.0850.0728,90)];}
if([UIApplication sharedApplication].statusBarOrientation==UIInterfaceOrientationAndscapeRight){
_bannerView=[[GADBannerView alloc]initWithFrame:CGRectMake(-10615.0728,90)];}
if([UIApplication sharedApplication].statusBarOrientation==UIInterfaceOrientationAndscapeLeft){
_bannerView=[[GADBannerView alloc]initWithFrame:CGRectMake(-10615.0728,90)];}
}
其他的
_bannerView=[[GADBannerView alloc]initWithFrame:CGRectMake(0410320,50)];
//initWithAdSize:kGADAdSizeBanner];
//initwithframe:CGRectMake(0.0,0.0320,50)];
self.bannerView.adUnitID=@“XXXXXXXXXXXXXXXXXX”;
self.bannerView.rootViewController=self;
GADRequest*请求=[GADRequest请求];
//在模拟器上启用测试广告。
[self.view addSubview:(_bannerView)];
request.testDevices=@[GAD_模拟器ID,@“XXXXXXXXXXXXXXXXXXXXXXXX”];
[self.bannerView loadRequest:request];
//奥斯布伦登酒店
NSLog(“检查购买的产品”);
如果([[u werbung isEqual:@“gekauft]”){
self.bannerView.hidden=TRUE;
}
NSLog(@“%@”,_werbung);
NSLog(@“%@”,self.werbung);
}
//IAPHelper.m
#导入“IAPHelper.h”
#进口
#导入“ReportViewController.h”
@接口IAPHelper()
@结束
@IAPHelper的实现
-(id)initWithProductIdentifiers:(NSSet*)productIdentifiers
{
//self=[super init];
if((self=[super init])){
//存储产品标识符
_productIdentifiers=productIdentifiers;
//检查以前购买的产品
_purchasedProductIdentifiers=[NSMutableSet];
[[SKPaymentQueue defaultQueue]addTransactionObserver:self];
for(NSString*productIdentifier在_productIdentifiers中){
BOOL productPurchased=[[NSUserDefaults standardUserDefaults]boolWorkey:productIdentifier];
如果(购买的产品){
[\u purchasedProductIdentifier addObject:productIdentifier];
NSLog(@“以前购买的:%@”,productIdentifier);
如果([productIdentifier isEqual:@“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”]){
ReportViewController*rvc=[[ReportViewController alloc]init];
rvc.werbung=@“gekauft”;
NSLog(@“werbung gekauft!”);

NSLog(@“%@”,rvc.werbung);这不是继承的问题-继承控制子类将从其父类获得的行为。问题似乎是一个实例

ReportViewController
是一个类。因此它不是一个实际的参与者。它只是描述创建的任何
ReportViewController
s将如何运行。就像一个宪法一样

当您调用
alloc]init]
时,您创建了视图控制器的一个新实例。然后您将广告设置为在该实例上购买。您不会将该实例放在任何位置或以其他方式保留它。因此,该实例不再存在

在其他地方,在一个完全不同的实例中,您检查广告值。没有人告诉该实例任何事情。因此您可以看到
nil

将其与
NSString
完全相同。在下面的代码中,
stringB
是否应该更改值

NSMutableString *stringA = [[NSMutableString alloc] init];
NSMutableString *stringB = [[NSMutableString alloc] init];

[stringA appendString:@"Mo' string for ya'"];

用于设置
werbung
值的
ReportViewController
不是检查值的同一个控制器。执行赋值的控制器是分配该值的方法的本地控制器。

您能分辨哪些对象变为
null
?NSLog(@“%@”,u-werbung);那么您将_werbung设置为非零的代码行在哪里?您的意思是:rvc.werbung=@“gekauft”;?记录为null的两行似乎不在任何函数上下文中。这可能是错误的假设,也可能是调用时的错误假设。@A-Live我已经记不清尝试将集合属性提供给视图的UIViewController子类的数量,它隐式地假设在加载视图之前不会设置任何属性。though至少在iOS 6+下,如果时间紧迫,您可以添加一条注释,说明您将要做的工作效率非常低,并在setter中添加强制视图加载。。。