2017-08-15 37 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

關於正在進行或如何解決它的任何想法?我在這裏不知所措。

順便說一句,這是一個簡化的例子。在我的真實應用程序中,我無法控制Objective-C類,它們作爲庫導入。

+0

我覺得你應該調用'super.init(編碼器:aDecoder)'之前初始化'userInfo'。您可以標記'userInfo'隱式地解開'var userInfo:MTUserInfo'來處理您將收到的錯誤。 –

+0

艾倫,謝謝你的指針。不幸的是,它對我收到的問題沒有影響。如果我將它更新爲局部變量,則這些屬性最終會指向內存中的任意位置。 –

+1

問題是這些屬性是分配的,這意味着ARC不保留它們。 –

回答

2

更改屬性... NSString不能是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

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