2017-08-15 6 views
0

SwiftでObjective Cクラスを初期化しようとしていますが、予期しない結果が出ています。プロパティはすべて文字列であり、初期化中にインラインで設定されます。新しいオブジェクトを使用しようとすると、プロパティは設定したものではなく、任意の値を指しているように見えます(私が推測しているのは、それらが指しているメモリの場所にあるものをピックアップしていることだけです)。ここで私が持っているものです。SwiftのObjective-Cクラスのプロパティを初期化すると、予期しない値とタイプが発生する

MTUserInfo.h

#import <Foundation/Foundation.h> 

@interface MTUserInfo : NSObject 

@property (nonatomic, readonly, assign) NSString* firstName; 
@property (nonatomic, readonly, assign) NSString* lastName; 
@property (nonatomic, readonly, assign) NSString* userEmail; 
@property (nonatomic, readonly, assign) NSString* userPhone; 

- (instancetype)initWithFirstName:(NSString*)firstName 
         lastName:(NSString*)lastName 
         userEmail:(NSString*)userEmail 
         userPhone:(NSString*)userPhone; 

@end 

MTUserInfo.m

#import "MTUserInfo.h" 

@implementation MTUserInfo 

- (instancetype)initWithFirstName:(NSString *)firstName 
         lastName:(NSString *)lastName 
         userEmail:(NSString *)userEmail 
         userPhone:(NSString *)userPhone 
{ 
    self = [super init]; 

    if (self) { 
     _firstName = firstName; 
     _lastName = lastName; 
     _userEmail = userEmail; 
     _userPhone = userPhone; 
    } 

    return self; 
} 

@end 

かつ迅速で、私の簡単なビューコントローラ:

import UIKit 

class ViewController: UIViewController { 
    var userInfo: MTUserInfo 

    required init?(coder aDecoder: NSCoder) { 
     userInfo = MTUserInfo(firstName: "Firstname", 
           lastName: "Lastname", 
           userEmail: "[email protected]", 
           userPhone: "555-555-4433") 

     super.init(coder: aDecoder) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     print("User info: ", self.userInfo.firstName) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

私はそれをデバッグ、ここに私が得るものがあります: enter image description here

何が起こっているのか、それを修正する方法についてのアイデアはありますか?私はここに迷っている。

Btw、これは単純化された例です。私の実際のアプリではObjective-Cクラスを制御できません。ライブラリとしてインポートされます。

+0

私はあなたが 'でsuper.init(aDecoderコーダ)を呼び出すされるべきだと思います。 'userInfo'を暗黙的にアンラップした' var userInfo:MTUserInfo'に、あなたが受け取るエラーを処理するようにマークすることができます。 –

+0

アレン、ポインタありがとう。残念ながら、それは私が得ている問題に影響しません。イベントをローカル変数に更新すると、メモリ内の任意の場所を指すようになります。 –

+1

問題はこれらのプロパティが割り当てられていることです。つまり、ARCはそれらのプロパティを保持していません。 –

答えて

2

プロパティを変更してください... NSStringsをassignにすることはできません。

のいずれかを使用copy

@property (nonatomic, readonly, copy) NSString* firstName; 
@property (nonatomic, readonly, copy) NSString* lastName; 
@property (nonatomic, readonly, copy) NSString* userEmail; 
@property (nonatomic, readonly, copy) NSString* userPhone; 

strong: `userInfo`を初期化する前に`:

@property (nonatomic, readonly, strong) NSString* firstName; 
@property (nonatomic, readonly, strong) NSString* lastName; 
@property (nonatomic, readonly, strong) NSString* userEmail; 
@property (nonatomic, readonly, strong) NSString* userPhone; 
関連する問題