Nid*_*aed 1 iphone xcode cocoa-touch memory-management objective-c
我有关于在Objective-C中分配属性的以下问题,
如果我有以下财产:
@property (nonatomic, retain) NSArray *arr;
@synthize arr=_arr;
Run Code Online (Sandbox Code Playgroud)
我应该像这样分配这个数组:
arr=[[NSArray alloc]init];
Run Code Online (Sandbox Code Playgroud)
如果我愿意,分配它的最佳位置在哪里?
我知道我应该释放它,但是保留一个属性会使其保留计数增加1并且分配它会使它增加1,我是对的.
您可以通过两种方式分配数组:
直接使用保留值设置ivar,如下所示:
_arr = [[NSArray alloc] init];
Run Code Online (Sandbox Code Playgroud)使用如下自动释放值设置属性:
self.arr = [NSArray array];
Run Code Online (Sandbox Code Playgroud)您可以在类的init方法中执行此操作,虽然您没有说明它使用的是哪个超类,所以我不确定init方法应该如何.如果是NSObject,它将如下所示:
- (id)init
{
if ((self = [super init]))
{
self.arr = [NSArray array];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
但如果它是一个UIViewController,你需要使用initWithNibName:bundle,如下所示:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
if ((self = [super itWithNibName:nibNameOrNil bundle:bundleOrNil]))
{
self.arr = [NSArray array];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
然后你需要在dealloc方法中释放它,如下所示:
- (void)dealloc
{
[_arr release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
但是,您应该记住NSArrays一旦创建就无法更改,因此您可能要么使用某些对象初始化它,如下所示:
self.arr = [NSArray arrayWithObjects:object1, object2, nil];
Run Code Online (Sandbox Code Playgroud)
或者如果您想稍后向其添加对象,您应该将其定义为NSMutableArray,如下所示:
@property (nonatomic, retain) NSMutableArray *arr;
Run Code Online (Sandbox Code Playgroud)
并初始化:
self.arr = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)
这将允许您稍后添加对象.
顺便说一句,如果你的dealloc方法出错,这可能意味着你的项目正在使用ARC,这是iOS 5中的一项新技术,这意味着你不再需要编写发布和保留语句.
如果您不使用ARC,我建议您这样做,因为它可以节省您不必担心这个保留/发布的东西 - 任何刚开始的iOS开发人员都应该为每个项目使用ARC,但因为它只是介绍在iOS 5中,很多Objective-C书籍都没有涵盖它.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |