将对象插入带有属性的数组时,是否有理由使用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
答案 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和函数参数之间的区别。