我是否同时需要变量和属性?
我是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
),都是必需的。