在Swift中初始化一个Objective-C类的属性会导致意外的值和类型

问题描述:

我想在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不保留它们。 –

更改属性... 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;