不为自定义对象启动不带@synthesis的属性



我正在开发一个应用程序,其中我为模型,视图和控制器创建了一些类。

模型类很少,即

CellModel.h

#import <Foundation/Foundation.h>
@interface CellModel : NSObject{
}
@property(nonatomic, assign)BOOL isSelected;
@property(nonatomic, retain)NSString *headingText;
@property(nonatomic, retain)NSString *subHeadingText;
@end

CellModel.m

#import "CellModel.h"
@implementation CellModel
@end

上面提到的类将充当每个单元格的模型对象

表模型.h

/*This is the model class navgation bar menu and will contain objects of "CellModel only"*/
#import <Foundation/Foundation.h>
@interface TableModel : NSObject{
}
@property(nonatomic, retain)NSMutableArray* menuOptionsArray;
@end

表模型.m

#import "TableModel.h"
@implementation TableModel
@end

现在在视图控制器类中,我创建了名为 *tableModelObj 的 TableModel 类型的属性。 在一种方法中,我在 tableModelObj.menuOptionArray 中添加了不同类型的 CellModel 的不同对象

但我不知道为什么,但是当我尝试在此数组中添加对象时,对象"tableModelObj"始终为空。

附言我不想合成我的属性,因为在 XCode 4.6 中没有必要这样做。

我认为

不是空的表模型,而是可能需要在添加元素之前初始化可变(menuOptionsArray)数组...

@synthesize将创建属性getter/setter方法,但它不会分配对象的实例变量,也不会释放它们。 你需要:

@implementation TableModel
- (id)init {
    self = [super init];
    if (self) {
        // NOTE! an autorelease object is used
        self.menuOptionsArray = [NSMutableArray array];
    }
    return self;
}
- (void)dealloc {
    self.menuOptionsArray = nil;
    [super dealloc];
}
@end

使用 MRR 时,您需要对所有对象执行此操作。

getter 和 setter 确实是为您生成的,但它们所做的只是设置或返回您存储在 iVar 中的值,在任何时候都不会执行初始化。

最佳做法是创建自定义延迟初始值设定项 getter。例如,最基本的选择是执行以下操作:

-(NSMutableArray*)menuOptionsArray
{
   if(!_menuOptionsArray)
      _menuOptionsArray = [[NSMutableArray alloc] init];
   return _menuOptionsArray;
}

最新更新