我面临一些涉及弱属性和强属性的困惑。为简洁起见,我不会包含整个代码。
我创建了一个返回 UIView 对象的类便捷方法,并在 UIView 类别中实现它作为子类化的替代方法。
@implementation UIView (CSMonthView)
+ (UIView *)monthViewFromDateArray:(NSArray *)arrayOfAllShiftsAndEvents withNibOwner:(id)owner selectedDate:(NSDate *)selectedDate withCompletionHandler:(void(^)(CSCalendarButton *selectedButton))block
{ // .. do some stuff
// Create an instance of UIView
UIView *monthView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 200.0)];
// Create UIButtons and set the passed down 'owner' value, as the target for an
// action event.
// Add UIButton as subviews to monthView....
return monthView;
}
我应该注意,在方法内部我没有任何指向monthView的东西。
现在在“所有者”的实现中,这是一个名为 CSCalendarViewController 的类,我通过调用类便利方法创建上述 UIView 并将其分配给名为 _monthView 的 UIView 属性。
@interface CSCalendarViewController : UIViewController
@property (weak, nonatomic) UIView *monthView;
@end
@implementation CSCalendarViewController
__weak CSCalendarViewController *capturedSelf = self;
// Create the current month buttons and populate with values.
_monthView = [UIView monthViewFromDateArray:_arrayOfAllShiftsAndEvents withNibOwner:self selectedDate:_selectedDate withCompletionHandler:^(CSCalendarButton *selectedButton) {
capturedSelf.selectedButton = selectedButton;
[capturedSelf.selectedButton setSelected:YES];
}
现在我的困惑是这样的。即使我将属性“monthView”定义为弱,“monthView”仍然保留返回的 UIView 的值。
如果我继续做这样的事情:
_monthView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 200.0)];
编译器发出警告(应该如此)说“将保留对象分配给弱变量”。
当我将“monthView”分配给从类方法返回的 UIView 时,为什么我没有收到相同的错误消息?
在 ARC 之前的内存管理方面,我没有深入的了解,而且我认为我遗漏了一些明显的东西。谢谢。