Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”

#import <Foundation/Foundation.h>

@interface EOCRectangle : NSObject<NSCoding>
@property (nonatomic , readonly , assign) float width;
@property (nonatomic , readonly , assign) float height;
-(id)initWithWidth:(float) width andHeight:(float) height;
@end

#import "EOCRectangle.h"
/**
 *  为对象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”
 */
@implementation EOCRectangle
-(id)initWithWidth:(float) width andHeight:(float) height
{
    if ((self = [super init])){
        _width = width;
        _height = height;
    }
    return self;
}
/**
 *  初始化设置默认的值
 */
//-(id)init
//{
//    return [self initWithWidth:10.0 andHeight:10.0];
//}
/**
 *  初始化抛出异常
 */
-(id)init{
    @throw [NSException exceptionWithName:NSInternalInconsistencyException
                                   reason:@"Must use initWithWidth:(float) width andHeight:(float) height instead"
                                 userInfo:nil];

}
/**
 *  初始化NSCoding
 */
-(id)initWithCoder:(NSCoder *)aDecoder{
    if ((self = [super init])){
        _width = [aDecoder decodeFloatForKey:@"width"];
        _height = [aDecoder decodeFloatForKey:@"height"];
    }
    return self;
}
@end

但在我自己写的过程中,忘记将初始化方法名以 init 开头,导致错误:

 Cannot assign to ‘self‘ outside of a method in the init family

原因:在ARC有效时,只能在init方法中给self赋值,Xcode判断是否为init方法规则:方法返回id,并且名字以init+大写字母开头+其他  为准则。

如果此时关闭ARC,会发现刚才的错误提示不见了:

如果将初始化方法名改为 - initialize,同样有错误提示,因为不符合上面的命名规则。

这样的命名规则是为了保证ARC开启时内存管理不出错,同时,init方法必须是实例方法,并且必须返回实例对象,这样要求的原因同上。

Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”

原文地址:https://www.cnblogs.com/lxlx1798/p/9714286.html

时间: 2024-10-22 16:37:21

Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”的相关文章

xcode工程编译错误:No architectures to compile for

问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 原因 导致这个错误的原因主要是CPU的编译架构引起的,Build Active Architecture Only属性设置为了YES(只编译当前模拟器指令集),当出现不兼容设备时就会出现错误. 解决 在工程Build Settings,

Unity打包xcode工程编译错误整理

Unity打包xcode工程二次开发遇到的问题及解决办法 1.library not found for -liPhone-lib 这个是libary路径的问题,打包的时候自行为路径加了引号"$(SRCROOT)/Libraries" 解决办法,将libary search path 下的路径引号去掉$(SRCROOT)/Libraries 2.openGL引用的错误,发送在xcode6,xcode对类库进行了升级造成openGLS改名了 解决办法,把原来的替换掉 #import &l

xcode工程编译错误:一般错误总结

1.Apple LLVM 8.0 Error Group /'all-product-headers.yaml' not found 最近升级了xcode打包后出现了个BUG,记录解决的方法. 现象:报错误信息:"......'all-product-headers.yaml' not found" 原因:新增加了第三方库 解决: 1.检查工程-Target-Build Settings 设置Defines Module的值是否为YES "Defines Module = Y

xcode工程编译错误:missing required architecture i386 解决方法

可能原因一:项目内保存了.framework文件,在复制分发到不同计算机的时候可能会引发该错误 解决方法一:来到Targets->Build Settings->Framework Search Paths,将其内容删除.让xcode不管项目目录下的.framework文件,而是去包含本机的.当然你也可以手动删除它们. 解决方法二:这个是在stack overflow上看到的: I had this same problem, and the solution turned out to be

xcode工程编译错误:error: Couldn’t materialize

错误信息: error: Couldn't materialize: couldn't get the value of variable amount: variable not available error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression. 解决:Release改为Debug

xcode工程编译错误:&quot;An instance 0xca90200 of class UITableView was deallocated while key value observers were still registered with it&quot;

An instance 0xca90200 of class UITableView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to

xcode工程编译错误之iOS解决CUICatalog: Invalid asset name supplied问题

[问题分析]: 这个问题其实是老问题,产生原因就是因为在使用的时候 [UIImage imageNamed:]时,图片不存在或者传入的图片名为nil. [解决方法]: 添加一个系统断点,来判断如果图片名字为nil或者@""的时候,来拦截掉.[操作截图] 原文地址:https://www.cnblogs.com/lxlx1798/p/10326627.html

xcode ___gxx_personality_v0&quot; 编译错误

xcode ___gxx_personality_v0" 编译错误 Undefined symbols for architecture i386: "___gxx_personality_v0", referenced from: ... 在XCODE工程 添加  libstdc++.dylib 即可

ios - cannot assign to &#39;self&#39; outside of a method in the init family

今天重写 - (id) initwithId:(NSInteger *)word_id word:(NSString *)word detail:(NSString *)detail方法时不注意将init后面的第一个字母写成了小写,在这个方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息如下:error:Cannot assign to 'self' outside of a method in the init family 原因:只能在init方法中