lua*_*nyi 1 xcode objective-c clang ios automatic-ref-counting
在XCode 4.6.2 ARC中,如果你在名为'retain'的类中有一些属性,那么IDE或编译堆栈都会做一些有趣的事情,使得类不能以通常的模式使用:[[MyClass alloc] init].
例如,如果我将类Foo定义为
// Foo.h
#import <Foundation/Foundation.h>
@interface MosquittoMessage : NSObject
@property (nonatomic, assign) BOOL retain;
-(id)init;
@end
// Foo.m
#import "Foo.h"
@implementation MosquittoMessage
-(id) init
{
self = [super init];
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
它会编译运行,但我不能使用
Foo *foo = [[Foo alloc] init];
Run Code Online (Sandbox Code Playgroud)
创造foo.运行时的上述语句将foo设置为nil.我使用调试器跟踪问题并发现alloc实际上返回了一个有效的Foo,但是在init中,由于某种原因它被释放,并且返回的self是nil.
任何人都对XCode或编译系统中的这个"bug"有任何想法吗?
添加:
当然'保留'是在Obj-C中保留的,我的问题是为什么编译器不抱怨它是否被允许?相反,它生成了错误的代码.
属性只是方法调用的语法糖.所以retain属性意味着一种retain方法.但是已经有了一种retain方法,你禁止用它来调用它.
您遇到的实际情况是Objective-C中的所有内容都是一个巨大的命名空间.您不希望任何内容与已存在的内容具有相同的名称 - 您可以使名称发生冲突,并最多获得警告或最坏情况下破坏应用程序的功能.我曾经通过命名一个属性打破了我的应用程序firstResponder; 即使没有公共方法有这个名字,显然这种方法存在于幕后,我不小心颠覆了它.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |