iOS-继承是如何工作的?
我实际上试图弄清楚Objective-C中的继承是如何工作的。我的问题是,我的目标。allways返回“null” 这是我的密码: 编辑:添加了代码的其余部分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
// 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中添加强制视图加载。。。