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

标签 ios objective-c cocoa

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

例如我看到这样的代码:

#import <Cocoa/Cocoa.h>

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

@end

但是,据我所知,如果我删除变量 captionphotographer 代码仍然可以工作:

#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/

相关文章:

ios - 过渡在 NavigationView 内不起作用

objective-c - 设置背景图像尺寸 IOS

macos - Mavericks+ 中的 CGEventTapCreateForPSN(已弃用 GetCurrentProcess)

objective-c - 当用户尝试从 NSOutlineView 具有子项时删除行时,显示 NSAlert

ios - Uber native 登录标记错误

ios - 在应用程序启动时查看协调器 : should I use View Controller or something else?

objective-c - 如何检测设备是否支持 FaceID?

iphone - 静态相当于 -forwardingTargetForSelector :

objective-c - 如何从 NSUserDefaults 中读取字符串

ios - 选择前预加载表格 View 数据