如何纠正这些警告"方便初始化程序错过了一个' self'打电话给另一个初始化程序"

时间:2017-05-16 18:49:17

标签: objective-c ios10

我将我的代码从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;
}

enter image description here

这是随附的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

2 个答案:

答案 0 :(得分:2)

你有两个选择:

  1. NS_DESIGNATED_INITIALIZER
  2. 移除-initWithCoder:
  3. NS_DESIGNATED_INITIALIZER添加到-init
  4. 更改-init以致电[self initWithCoder:]
  5. 前两个最有意义;没有编码器,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;

有关详细信息,请查看以下链接

Using NS_DESIGNATED_INITIALIZER