我将我的代码从iOS 8更新到iOS 9+,而在Xcode 8.2中,我收到了这些警告,并且不知道如何修复它。我几年前看过几篇SO帖子,暗示解决方案是让编译器静音而不是调整代码。
在不危及App Store接受的情况下处理这些警告的最佳方法是什么?
有一点需要注意,它不在屏幕截图中,而是在同一个文件中 - 这个初始化程序:
-(instancetype)initWithCoder:(NSCoder*)decoder{
if(self=[super init]){
// If parent class also adopts NSCoding, replace [super init]
// with [super initWithCoder:decoder] to properly initialize.
text=[decoder decodeObjectForKey:@"text"];
fontname=[decoder decodeObjectForKey:@"font"];
}
return self;
}
这是随附的Message.h:
#import <Foundation/Foundation.h>
@interface Message : NSObject <NSCoding>{
NSString *text;
NSString *fontname;
UIColor *color;
NSInteger speed;
NSInteger fontsize;
BOOL isMirror;
BOOL isReverse;
NSInteger transStyle;
NSInteger transDir;
NSInteger transSpeed;
BOOL isTransition;
BOOL isTextOnly;
NSInteger transOther;
NSInteger transPause;
}
@property (nonatomic,retain)NSString *text;
@property (nonatomic,retain)NSString *fontname;
@property (nonatomic,retain)UIColor *color;
@property (nonatomic,assign)NSInteger speed;
@property (nonatomic,assign)NSInteger fontsize;
@property (nonatomic,assign)BOOL isMirror;
@property (nonatomic,assign)BOOL isReverse;
@property (nonatomic,assign)NSInteger transStyle;
@property (nonatomic,assign)NSInteger transDir;
@property (nonatomic,assign)NSInteger transSpeed;
@property (nonatomic,assign)NSInteger transOther;
@property (nonatomic,assign)NSInteger transPause;
@property (nonatomic,assign)BOOL isTransition;
@property (nonatomic,assign)BOOL isTextOnly;
- (void) encodeWithCoder:(NSCoder*)encoder;
- (instancetype) initWithCoder:(NSCoder*)decoder NS_DESIGNATED_INITIALIZER;
@end
答案 0 :(得分:2)
你有两个选择:
NS_DESIGNATED_INITIALIZER
-initWithCoder:
NS_DESIGNATED_INITIALIZER
添加到-init
-init
以致电[self initWithCoder:]
前两个最有意义;没有编码器,2会相当困难。
答案 1 :(得分:2)
Apple论坛解释: https://forums.developer.apple.com/thread/6757
指定初始化程序的规则很复杂,我要去 将您反馈给一般案例的文档。奇怪的是,我找到了 这个的最佳解释是The的“初始化”部分 Swift编程语言,因为相同的概念适用于两者 Swift和Objective-C。在您的特定情况下,您应该覆盖-init 并在运行时失败。您还应该在标题中标记它 使用NS_UNAVAILABLE,它将允许编译器捕获它 典型。以上情况适用,因为您的课程不可能 在没有模型的情况下运行,因此您无法合理地实现-init 以任何有用的方式。如果可以,你应该。例如,如果你是 创建自己的字符串对象,它会有意义 通过调用super实现-init,然后将字符串初始化为 空字符串。
将以下行添加到 Message.h 文件
-(instancetype)init NS_DESIGNATED_INITIALIZER;
有关详细信息,请查看以下链接