【发布时间】:2012-03-02 17:59:39
【问题描述】:
为什么这个 init 方法会返回一个超出范围的对象?
使用 XCode 4.2、4.3 的基本 SDK 和 ARC,我正在尝试从 nib(而不是 UIViewController)加载 UIView。在这个过程中我根本不需要使用 UIViewController。
在阅读 S.O. 的这个答案后。这里的问题,看起来可以做到: How to load a UIView using a nib file created with Interface Builder (用户“MusiGenesis”的回答描述了这个过程)
我创建了一个带有单个标签的 UIView 子类:
@interface MyView : UIView
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *textLabel;
@end
在实现中我重写了 initWithFrame:
- (id)initWithFrame:(CGRect)frame
{
//self = [super initWithFrame:frame];
self = [JVUIKitUtils initWithNibName:@"MyView" withOwner:self];
if( self )
{
NSLog(@"Created");
}
return self;
}
在 I.B.我用一个视图创建了一个名为“MyView.xib”的文件。它有一个标签作为子视图,我通过将它拖到 h 文件中来创建标签属性。
在另一个文件中,我创建了这个可重用的静态方法:
+ (id)initWithNibName:(NSString*)nibName withOwner:(id)uiView
{
id object = nil;
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:nibName owner:uiView options:nil]; // 1 object, out of scope
for( id tempObject in bundle)
{
if( [tempObject isKindOfClass:[uiView class]] ) object = tempObject;
break;
}
return object;
}
正如您在以下屏幕截图中所见,捆绑包有一个对象引用,但它超出了范围。
和调试:
这是我的实例化代码:
subView = [[MyView alloc] initWithFrame:CGRectZero]; // ok
NSAssert(subView != nil, @"MyView was nil"); // fail
关于为什么其他 S.O. 的任何想法海报能够让它工作,但它没有?
【问题讨论】:
-
我不知道你想用
self = [JVUIKitUtils initWithNibName:@"MyView" withOwner:self]做什么,但这绝对是错误。 -
我正在尝试从静态类加载笔尖。为什么这是错误的?
-
另外,您不能将 ARC 与 4.3 的基础 SDK 一起使用。
-
@hwaxxer ARC 适用于任何 SDK 到 iOS 4。
-
基础 SDK 和部署目标之间存在差异。 ARC 适用于 iOS 4 的部署目标,但它是否适用于 iOS 4 的基本 SDK?在任何情况下,您都不应该使用 iOS 4 的基础 SDK。
标签: iphone ios uiview bundle nib