【问题标题】:Objective C arc -- keeping a reference to a ClassObjective C arc——保持对类的引用
【发布时间】:2012-04-26 02:30:02
【问题描述】:

我想要一个 Class 类型的 ivar,并在传入后保留指针。但无论我做什么,arc 都不会让我这样做。例如,如果我声明

@property (nonatomic, strong) Class myClass;

编译器决定 myClass 应该是 unsafe_unretained。如果我试试这个:

-(id) initWithClass: (Class) passedInClass {
   if ((self = [super init])) {
     self.myClass = passedInClass;
   }
   return self;
}

发生的情况是,即使该类在调用代码中为非 nil,在 init 方法中也是 nil。

关掉电弧短,有什么办法可以解决这个问题吗?

编辑:这个问题是错误的。它确实有效。查看接受的答案。

【问题讨论】:

  • 类与 ARC 不兼容。一些 objc 对象具有自定义内存管理(即它们覆盖保留释放和释放),因此不能与 ARC 一起使用。我不知道任何地方是否有它们的列表,但我很确定 Class 是其中之一。我不知道任何解决方案,所以我不会将此作为答案发布。
  • @borrrden ARC 处理类指针。 clang Automatic Reference Counting, section 3 “Retainable object pointers”:“可保留对象指针类型共有三种:……Objective-C 对象指针(id、Class、NSFoo* 等)……”
  • @robmayoff 那怎么样...我的立场是正确的>_

标签: objective-c ios automatic-ref-counting


【解决方案1】:

与针对 10.7 和 5.1 的 Xcode 4.3.2 广告宣传的一样:

@interface MOYNObject : NSObject
@property (nonatomic, strong, readwrite) Class myClass;
@end

@implementation MOYNObject
@synthesize myClass;

- (id)initWithClass:(id)pClass
{
    self = [super init];
    if (self != nil)
        self.myClass = pClass;
    assert(self.myClass);
    CFShow((__bridge const void*)self.myClass);
    return self;
}

@end

int main(int argc, const char* argv[]) {
    @autoreleasepool {
        MOYNObject * o = [[MOYNObject alloc] initWithClass:[NSString class]];
        // ...
    }
    return 0;
}

你领先还是落后于 4.3.2?

【讨论】:

  • 我在 4.3.2;想知道为什么你的有效而我的无效。我会调查的。
  • 你是对的。我有一个不相关的错误并被误解了。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多