2014-12-29 2 views
1

실제로 Objective-C의 상속이 어떻게 작동하는지 알아 내려고합니다. 내 문제는, 그건 내 obj. allways "null"을 반환합니다.iOS - 상속은 어떻게 작동합니까?

여기 내 코드입니다.

편집 : 나머지 코드가 추가되었습니다.

// 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; 
} 

제 질문은 : 내가 뭘 잘못 했습니까? 어쩌면 너는 나를 위해 좋은 지침서를 가지고 있을까?

편집 : 당신이 맞았습니다. 상속에 관한 것이 아닙니다. 내 솔루션 UserDefaults 함께 작동합니다.

+2

어떤 개체가 'null'인지 알 수 있습니까? – Hemang

+0

NSLog (@ "% @", _werbung); <- 이것은 "null"입니다. NSLog (@ "% @", self.werbung); <-이 또한 "null"입니다 // 코드 btw에 표시되었습니다. –

+0

그래서 _walbung을 nil이 아닌 곳에 설정하는 코드 행은 어디에 있습니까? – gnasher729

답변

1

이것은 상속의 문제가 아닙니다. 상속은 하위 클래스가 부모로부터 획득하는 동작을 제어합니다. 이 문제는 인스턴스 중 하나 인 것 같습니다.

ReportViewController은 클래스입니다. 따라서 실제 배우가 아닙니다. 작성된 ReportViewController이 어떻게 작동하는지 설명하는 것입니다. 헌법처럼.

alloc] init]으로 전화하면보기 컨트롤러의 새 인스턴스 하나를 만듭니다. 그런 다음 해당 인스턴스에서 구입 한 광고를 설정합니다. 인스턴스를 어디에 두거나 그렇지 않으면 인스턴스를 유지하지 않습니다. 따라서이 사례는 사라집니다.

완전히 다른 인스턴스에서 광고 값을 확인합니다. 아무도 그 인스턴스에 아무 것도 말하지 않았다. 그러면 nil 값이 표시됩니다.

정확히 NSString과 같다고 생각하십시오. 아래 코드에서 stringB 값을 변경해야합니까? 당신이 werbung 값을 설정하는 데 사용하는

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

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

[viewDidLoad] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/viewDidLoad)에 대한 잘못된 가정.)가 호출됩니다. –

+0

@ A-Live 뷰를로드 한 후에야 속성이 설정되지 않는다고 암시 적으로 가정하면서 뷰에 속성을 설정하려고 시도한 UIViewController 하위 클래스의 수를 잃어 버렸습니다. 비록 적어도 iOS 6 이상에서 시간이 긴 경우에는 당신이 할 일이 매우 비효율적이며 setter에서 강제로보기로드를 추가하는 효과에 코멘트를 추가 할 수 있습니다 ... – Tommy

1

ReportViewController는 값을 확인하고 동일한 컨트롤러가 아닙니다. 할당을 수행하는 곳은 할당되는 메소드에 대해 로컬입니다.

관련 문제