Objective-C属性和私有变量

时间:2014-03-23 08:56:45

标签: objective-c syntax

我是客观c的首演,我不明白。 我练习了c ++,所以有些练习不是本能的。

1)

@implementation Car {
    // Private instance variables
    double _odometer;
}

为什么私有属性在.m文件中?

2)

@interface Car : NSObject {
    // Protected instance variables (not recommended)
}

@property (copy) NSString *model;

-(void)drive

a)似乎模型被声明为属性,但为什么不建议在@interface中进行模式?

b)为什么驱动方法不在界面中?

3)

如果我没有使用函数分配作为NString的例子并使用@" ..."直接初始化它怎么办? ?

4)

在方法声明之前我也不理解+和 - 之间的区别..

提前致谢

2 个答案:

答案 0 :(得分:2)

1.>为什么私有属性在.m文件中

为什么不呢? * .m内声明的所有内容都是私有的,因为* .m文件无法在某处导入(包含)。在目标C中,您可以在两个文件中声明实例变量 - * .h和* .m

2.a推荐的方法是使用访问器(Objective C中的@properties)。对于每个属性setter,都会生成getter和instance变量。

的默认名称
@property (copy)NSString *str;

是:

- (void)setStr:(NSString*)obj; // setter
- (NSString*)str; //getter
NSString *_str; //instance variable

您可以修改访问者名称

@property (copy, setter = NewSetterName, getter = NewGetterName )NSString *str;

和实例变量名称(应该完成@implementation部分)

@synthesize str = _newStingInstanceVariable;

Ofcource你可以重写默认生成的setter和getter。

2.b界面是@implementation@end之间的所有内容。在@interface之后的{}区域 - 是一个可以声明实例变量的地方。

3.对NSStrings来说没问题

NSString *str = @"some text";

但是对于大多数课程来说,它不会像你期望的那样工作:

NSMutableString *str = @"some text"; 
// You will receive warning here! And str will be NSString, not NSMutableString

4. " +" - 类方法(在C ++中为静态)," - " - 实例方法。

答案 1 :(得分:0)

编程中的一般原则是,您应该向外部提供尽可能少的信息。 .h文件中的任何内容,世界上的任何人都可以查看,访问和搞砸。如果_odometer出现问题并且它在头文件中,则必须通过所有源代码来查找是否有错误。如果它只在.m文件中,你知道如果有问题,它就在.m文件中。

不公开的另一个原因是,如果没有人知道,你可以自由地改变它们。出于某种原因,你下个月决定首先使用_odometer不是一个好主意。到目前为止,已经有三个程序员改变了十几个文件来使用_odometer,因为它就在那里。所以删除那个_odometer现在很多,很多工作。如果它从未在.h文件中,则没有人使用它,因此您只需要更改自己的.m文件。