在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.
}
}
关于正在进行或如何解决它的任何想法?我在这里不知所措。
顺便说一句,这是一个简化的例子。在我的真实应用程序中,我无法控制Objective-C类,它们作为库导入。
答
更改属性... 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;
我觉得你应该调用'super.init(编码器:aDecoder)'之前初始化'userInfo'。您可以标记'userInfo'隐式地解开'var userInfo:MTUserInfo'来处理您将收到的错误。 –
艾伦,谢谢你的指针。不幸的是,它对我收到的问题没有影响。如果我将它更新为局部变量,则这些属性最终会指向内存中的任意位置。 –
问题是这些属性是分配的,这意味着ARC不保留它们。 –