我是否同时需要变量和属性?

我是iOS开发的新手,在理解某些情况时遇到了麻烦。 我的问题是我是否同时需要变量和属性?

例如,我看到这样的代码:

#import  @interface Photo : NSObject { NSString* caption; NSString* photographer; } @property (retain) NSString* caption; @property (retain) NSString* photographer; @end 

但是,据我所知,如果我删除变量标题摄影师代码仍然可以工作:

 #import  @interface Photo : NSObject @property (retain) NSString* caption; @property (retain) NSString* photographer; @end 

所以,请解释使用第一个和第二个的区别。

谢谢,任何建议!

{}括号内的变量是实例变量。 他们只能上课。

@property定义了(options)表示的一些不同的东西。

大多数人在.m和.h文件中使用@property方便方法。 例如

 @property (strong) NSString *string; 

在你的.h和.m文件中创建两个方法,虽然你看不见,称为:

 -(NSString *)string; //returns the string object -(void)setString:(NSString *)string; 

因此它的作用是提高可读性并有助于减少大量锅炉板代码。

现在不再需要在{}括号内定义实例变量。

如果您需要将实例变量设置为其他名称,则可以放置一个

 @synthesize string = _string; 

因为你是这个Ill的新手,所以添加一些额外的东西供你思考。 self.string = @“string”可能不是与string = @“string”等效的调用

如果你有@property(强)NSString * string; 和@synthesize字符串; 这样做的原因是通过self.string设置字符串是使用方法实现来设置字符串,可以像这样重写:

 -(void)setString:(NSString *)str{ string = [NSString stringWithFormat:@"%@.jpg", str]; } 

所以self.string = @“hello”将是@“hello.jpg”,其中string = @“hello”只是“你好”

另外self.string = @“string”; 与[self setString:@“string”]大致相同;

有关@hperty(强)NSString *字符串在.h内添加的内容的说明:

 { NSString *_string; } -(void)setString:(NSString *)string; -(NSString *)string; 

在.m内:

 -(void)setString:(NSString *)string{ _string = string; } -(NSString *)string{ return _string; } 

所以没有必要调用@synthesize,除非你想将iVar重命名为其他东西@synthesize string = wibblyWobblyTimeyWimey;

所以.h就是这样

 { NSString *wibblyWobblyTimeyWimey; } 

在.m内

 -(void)setString:(NSString *)string{ wibblyWobblyTimeyWimey = string; } -(NSString *)string { return wibblyWobblyTimeyWimey; } 

如果您使用的是Xcode 4.6.x,并且已经安装了Clang 4或更高版本的命令行工具,则可以利用“自动合成”属性。

 @interface Photo : NSObject @property (retain) NSString* caption; @property (retain) NSString* photographer; @end 

将为您提供实例变量_caption和_photographer。 所以不,在大多数情况下,你真的不需要声明实例变量。 如果您使用的是ARC,那么使用属性才有意义。

如果您使用ARC,那么代码应该是什么样子:

 @interface Photo : NSObject @property (strong) NSString* caption; @property (strong) NSString* photographer; @end 

此外,通常最好指定nonatomic属性。 不这样做意味着clang将生成的访问器将使用锁:

 @interface Photo : NSObject @property (strong, nonatomic) NSString* caption; @property (strong, nonatomic) NSString* photographer; @end 

你不可以。 {}中的变量是私有成员,inheritance此头文件的类不可访问,而properties可以通过inheritance类来访问,读取和写入。

但情况并非总是如此。 在某些情况下,(如delegates ),都是必需的。