Iphone 关于自定义UIView的初始化和从xib加载的问题

Iphone 关于自定义UIView的初始化和从xib加载的问题,iphone,Iphone,我试图创建一个自定义UIView类,该类从包含该视图接口的xim文件加载。我试图将[NSBundle mainBundle]loadNibNamed…]封装在自定义视图的init方法中,如下所示: - (id)init { self = [super init]; if (self) { NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"LoadingV" owner:self

我试图创建一个自定义UIView类,该类从包含该视图接口的xim文件加载。我试图将[NSBundle mainBundle]loadNibNamed…]封装在自定义视图的init方法中,如下所示:

- (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;
}
我想知道:

  • 这样做是否可以接受?还有更好的办法吗
  • 如果我没有在dealloc中调用[自我释放],我是否应该保留“保留”
  • 干杯
    AF

    不,这是不可接受的,这是一种不好的做法,实际上您的内存泄漏

    更好的方法是使用一种称为“工厂”的模式

    例如:

    @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];
    

    不,这是不可接受的,这是一种不好的做法,而且实际上存在内存泄漏

    更好的方法是使用一种称为“工厂”的模式

    例如:

    @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];
    

    谢谢你的回复。在工厂函数中使用的逻辑ur几乎与我拥有的逻辑ur相似(仅当我删除retain时)。但ur函数是一个与self无关的类方法。如果我需要自定义视图的对象调用其他成员函数,该怎么办?UIView有
    awakeFromNib
    方法,您可以在其中自定义它。awakeFromNib对我没有用处,因为我正在尝试从xin加载自定义视图。那个电话还没打呢!创建了XIB文件,将视图对象放入该文件中,选择它并将其类设置为自定义类。那正是你想要的。我已经在做了。问题是当我想实例化该自定义视图并加载其xib文件时。这就是我想要达到的目标。上面的代码可以做到这一点,但只是想知道是否有更好的方法谢谢您的回复。在工厂函数中使用的逻辑ur几乎与我拥有的逻辑ur相似(仅当我删除retain时)。但ur函数是一个与self无关的类方法。如果我需要自定义视图的对象调用其他成员函数,该怎么办?UIView有
    awakeFromNib
    方法,您可以在其中自定义它。awakeFromNib对我没有用处,因为我正在尝试从xin加载自定义视图。那个电话还没打呢!创建了XIB文件,将视图对象放入该文件中,选择它并将其类设置为自定义类。那正是你想要的。我已经在做了。问题是当我想实例化该自定义视图并加载其xib文件时。这就是我想要达到的目标。上面的代码可以做到这一点,但只是想知道是否有更好的方法