【问题标题】:Why can't I alloc/init - get "Assigning retained object to unsafe property" warning?为什么我不能分配/初始化 - 得到“将保留的对象分配给不安全的属性”警告?
【发布时间】:2011-11-25 13:24:32
【问题描述】:

我是 ARC 的新手,我有一个对象,它有一些内部类作为成员。在 init 方法上,我想为它们分配新对象。

ClassA.h

#import "ClassB.h"
@interface ClassA : NSObject
@property (assign) ClassB *member;
@end

ClassB.h

@interface ClassB : NSObject
@property (assign) NSString *name;
@end

ClassA.m

@synthesize member = _member;
-(id)init
{
    _member = [[ClassB alloc] init];
}

但我收到“将保留的对象分配给不安全的属性”错误。我搜索了互联网,没有看到有关此特定警告的其他信息。它可以编译,但会出现运行时错误访问异常。

【问题讨论】:

  • 请使用您的实例变量发布 .h 文件。您这里的代码不完整。
  • 我遇到了同样的问题,直到我将“at”属性(分配)更改为“at”属性(强,非原子)

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


【解决方案1】:

直接的问题是您将对象分配给标记为weak 的成员,这意味着该对象将没有强引用并且将立即被释放。使用strongretain 而不是weakassign 将解决这个问题。

您的-init 方法的一个更大问题是它不调用[super init],并且它不返回任何内容。至少,您的-init 应如下所示:

-(id)init
{
    self = [super init];
    if (self != nil) {
        self.member = [[ClassB alloc] init];
    }
    return self;
}

【讨论】:

  • 谢谢,为了简洁起见,我保留了 [super init],但为了完整起见,您是正确的。感谢您的解释,我知道为什么 IBOutlets 很弱,而 xib 之外的成员对象需要很强大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多