我是 iOS 开发新手,在理解某些情况时遇到困难。 我的问题是我是否同时需要变量和属性?
例如我看到这样的代码:
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
但是,据我所知,如果我删除变量 caption 和 photographer 代码仍然可以工作:
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
所以,请解释一下使用第一个和第二个的区别。
谢谢您的建议!
最佳答案
{}括号内的变量是实例变量。它们仅可供类(class)访问。
@property 定义了一些由(选项)表示的不同事物。
大多数人使用 @property 来方便 .m 和 .h 文件中的方法。例如
@property (strong) NSString *string;
在 .h 和 .m 文件中创建两个方法,但对您来说是不可见的,称为:
-(NSString *)string; //returns the string object
-(void)setString:(NSString *)string;
所以它的作用是提高可读性并有助于减少大量样板代码。
现在不再需要在 {} 括号内定义实例变量。
如果您需要将实例变量设置为不同的名称,您可以添加
@synthesize string = _string;
既然你是新手,我会添加一些额外的东西供你思考。 self.string = @"字符串" 可能不是等效的调用 字符串=@“字符串”
如果你有 @property (strong) NSString *string;和@synthesize字符串; 原因是通过 self.string 设置字符串正在使用方法实现来设置字符串,并且可能会像这样被覆盖:
-(void)setString:(NSString *)str{
string = [NSString stringWithFormat:@"%@.jpg", str];
}
因此 self.string = @"hello"将是 @"hello.jpg",而 string = @"hello"只是“hello”
还有 self.string = @"string";与 [self setString:@"string"];
非常相似澄清 @property(strong)NSString *string 的作用 .h 内添加:
{
NSString *_string;
}
-(void)setString:(NSString *)string;
-(NSString *)string;
.m 内:
-(void)setString:(NSString *)string{
_string = string;
}
-(NSString *)string{
return _string;
}
因此,除非您想将 iVar 重命名为其他名称,否则无需调用 @synthesize @synthesize string = wibblyWobblyTimeyWimey;
所以在 .h 中它将是
{
NSString *wibblyWobblyTimeyWimey;
}
.m 内
-(void)setString:(NSString *)string{
wibblyWobblyTimeyWimey = string;
}
-(NSString *)string {
return wibblyWobblyTimeyWimey;
}
关于ios - 我是否同时需要变量和属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558147/