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.
}
}
關於正在進行或如何解決它的任何想法?我在這裏不知所措。
順便說一句,這是一個簡化的例子。在我的真實應用程序中,我無法控制Objective-C類,它們作爲庫導入。
我覺得你應該調用'super.init(編碼器:aDecoder)'之前初始化'userInfo'。您可以標記'userInfo'隱式地解開'var userInfo:MTUserInfo'來處理您將收到的錯誤。 –
艾倫,謝謝你的指針。不幸的是,它對我收到的問題沒有影響。如果我將它更新爲局部變量,則這些屬性最終會指向內存中的任意位置。 –
問題是這些屬性是分配的,這意味着ARC不保留它們。 –