2011-08-25 27 views
1

我想创建一个自定义的UIView类从一个xim文件加载,该文件包含该视图的接口。我想我的自定义视图的init方法内封装[一个NSBundle mainBundle] loadNibNamed ...]如下:关于初始化和负载从xib自定义UIView的问题

- (id)init 
{  
    self = [super init]; 
    if (self) 
    { 
     NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"LoadingV" owner:self options:nil]; 
     self = [(LoadingV*)[nibViews objectAtIndex: 0] retain]; 
    } 
    return self; 
} 

我想知道:

  1. 这是一个可以接受的方式这样做?有没有更好的办法?
  2. 我应该保留“保留”,因为我没有在dealloc中调用[self release]?

干杯 AF

回答

7

没有,这是不能接受的,这是不好的做法,你实际上有内存泄漏存在。

更好的方法是使用名为“工厂”的模式。

实施例:

@interface CustomView: UIView 
@end 

@implementation CustomView 
- (void)awakeFromNib { 
    // custom view loaded from nib 
} 
@end 

@interface UIView (Nib) 
+ (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle; 
@end 

@implementation UIView (Nib) 
+ (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle { 
    if (!nibName || [nibName length] == 0) { 
     return nil; 
    } 

    UIView *view = nil; 

    if (!bundle) { 
     bundle = [NSBundle mainBundle]; 
    } 

    // I assume, that there is only one root view in interface file 
    NSArray *loadedObjects = [bundle loadNibNamed:nibName owner:nil options:nil]; 
    view = [loadedObjects lastObject]; 

    return view; 
} 
@end 

用法:

// CustomView.xib contains one View object with its class set to "CustomView" 
CustomView *myView = (CustomView *)[UIView viewFromNib:@"CustomView" bundle:nil]; 
+0

感谢您的响应。在我的工厂函数中使用的逻辑ur与我所使用的几乎相似(只有当我删除保留时)。但是,ur函数是一个不与自身关联的Class方法。我应该怎么做,如果我需要我的自定义视图的对象调用其他成员函数? – Abolfoooud

+0

UIView有'awakeFromNib'方法,您可以在其中定制它。 –

+0

awakeFromNib对我无用,因为我试图从xin加载自定义视图。该电话将不会被呼叫! – Abolfoooud