自带数组和addObject

时间:2011-08-17 19:00:35

标签: iphone objective-c memory-management nsmutablearray self

将对象插入带有属性的数组时,是否有理由使用self调用getter / setter?即

[self.myArray insertObject: myObject];

或者我可以使用:

[myArray insertObject: myObject];

要点是:

·H

@interface ArrayViewController : UIViewController <UITextFieldDelegate>
{
   NSMutableArray *myArray;
   int itemNumber;
}
@property (nonatomic, retain) NSMutableArray *myArray;
@end

的.m

- (IBAction)createMyArray 
{
    self.myArray = [[NSMutableArray alloc] initWithObjects: nil];
}

-(IBAction) addItemToMyArray
{

    NSString *myString = [[NSString alloc] initWithFormat:@"item %d",itemNumber];

    [myArray addObject: myString];
    //[self.myArray addObject: myString]; //Or should I use self?
    [myString release];

    NSLog(@"myArray = %@", myArray);

    itemNumber++;
}

//- (void)dealloc etc. not shown

6 个答案:

答案 0 :(得分:1)

要么会工作,但你需要知道你在做什么。使用self.将调用setter / getter方法,而另一个将直接访问变量。在初始化器和dealloc方法之外,不鼓励直接使用变量,同时完全有效。原因是您正在失去该属性的好处,尤其是使用self.进行设置,因为它会正确地为您正确分配/复制/保留该值。不直接使用属性变量的另一个原因是因为原子性,但在您的情况下,您将其声明为nonatomic

答案 1 :(得分:1)

从概念上讲,只要你的getter方法只返回现有的字段值而不是,例如,做一些“及时”分配或其他类似的事情,它就无所谓了。

但是,最好提出一个你坚持的政策(个人或团体),以便该政策的警告成为第二天性。不断切换样式导致草率,错误的代码。

我倾向于总是使用self.来表示属性,只是为了提醒自己它们实际上是属性,并且不太可能在不使用属性表示法的情况下意外设置值。

答案 2 :(得分:0)

这两个都很好。这主要是一种风格选择。使用self.myArray会调用getter [self myArray]

答案 3 :(得分:0)

使用alloc / init时,不应将返回值设置为属性,因为它们将保留两次:

self.myArray = [[NSMutableArray alloc] initWithObjects: nil];

使用

myArray = [[NSMutableArray alloc] initWithObjects: nil];

self.myArray = [NSMutableArray array];

用于初始化。

虽然插入操作是等效的。

答案 4 :(得分:0)

我通常会跳过getter,因为我很少发现它很有价值,它会使代码的可读性稍微混乱。但是,我倾向于使用setter,因为我发现允许自动生成的setter方法处理保留/释放语义更容易

答案 5 :(得分:0)

在你的情况下,没有义务使用self.myArray,但对于这种情况,这是一项义务:

-(void) addItemToMyArray:(NSAarray *)myArray
{

    NSString *myString = [[NSString alloc] initWithFormat:@"item %d",itemNumber];

    [self.myArray addObject: myString];
    [myString release];

    NSLog(@"myArray = %@", self.myArray);

    itemNumber++;
}

类attribut和函数参数之间的区别。