在OC中@property(强)的用途是什么?

时间:2016-12-14 07:05:37

标签: ios objective-c

我的英语不好,我试着清楚地描述问题。 我知道@property@synthesize只是获取getter和setter方法。因此,我们可以self.x_x使用属性。 而self.x只是调用setter和getter方法。

@ property(strong)的结果是get方法如下: 一切都在ARC:

@property (nonatomic, strong) NSString *name;

- (NSString *)name {
  return _name;
}

- (void)setName:(NSString *)name {
  if (_name != name) {
    _name = name;
  }
}

所以,我的问题是,如果使用@property(strong)只是为了获取方法,我们可以使用以下内容。

- (void)setName:(NSString *)name {
  if (_name != name) {
    __weak _name = name;
  }
}

当我们使用self.name来设置setName:方法调用,并且我们得到一个弱名称,即使我们之前使用强,它看起来也是正确的。但还有其他一些例子。

@protocol TestDelegate <NSObject>
@end

@interface Test : UIView

@property (nonatomic, weak) id<TestDelegate> delegate;

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate;

@end

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate {
  self = [super init];
  if (self) {
    _delegate = delegate;
  }
  return self;
}

ViewController 中使用,所有 dealloc 无回收。然后我们使用

@property (nonatomic, strong) id<TestDelegate> delegate;

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate {
  self = [super init];
  if (self) {
    self.delegate = delegate;
  }
  return self;
}

- (void)setDelegate:(id<TestDelegate>)delegate {
  __weak _delegate = delegate;
}

所有都是dealloc,也没有回收。因为我们在init方法中使用self.delegatesetDelegate:方法调用我们得到弱委托,即使我们之前使用强。然后我们使用_delegate = delegate,它会回收!!! 我很困惑,我们使用weak_delegate = delegate,它运行良好,但我们使用strong_delegate = delegate和自定义弱集方法,它是循环使用。

谢谢!

1 个答案:

答案 0 :(得分:0)

代表必须是弱类型的属性。这将避免保留周期,因为可以在它们之间保留两个物体的无限循环。使用ARC时,这是使用委托的示例:@property (nonatomic, weak) id <MyObjectDelegate> delegate;