Objective-c中的"实例变量"和"属性"之间有区别吗?

我对此不是很确定.我认为"property"是一个具有访问器方法的实例变量,但我可能认为是错误的.

推荐答案

属性是一个更抽象的概念.实例变量实际上只是一个存储插槽,就像 struct 中的插槽一样.通常,其他对象永远不应该直接访问它们.另一方面,属性是对象的一个属性,可以访问(听起来很模糊,应该是这样的).通常一个属性会返回或设置一个实例变量,但它可以使用多个实例变量中的数据,也可以完全不使用.例如:

@interface Person : NSObject {
    NSString *name;
}

    @property(copy) NSString *name;
    @property(copy) NSString *firstName;
    @property(copy) NSString *lastName;
@end

@implementation Person
    @synthesize name;

    - (NSString *)firstName {
        [[name componentsSeparatedByString:@" "] objectAtIndex:0];
    }
    - (NSString *)lastName {
        [[name componentsSeparatedByString:@" "] lastObject];
    }
    - (NSString *)setFirstName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[NSArray arrayWithObjects:newName, nil] arrayByAddingObjectsFromArray:[nameArray subarrayWithRange:NSMakeRange(1, [nameArray size]-1)]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
    - (NSString *)setLastName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[nameArray subarrayWithRange:NSMakeRange(0, [nameArray size]-2)] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:newName, nil]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
@end

(注意:上面的代码有缺陷,因为它假定名称已经存在,并且至少有两个组件(例如"比尔·盖茨",而不仅仅是"盖茨").我觉得修正这些假设会让代码的实际意义变得不那么清晰,所以我只是在这里指出,这样就没有人会天真地重复这些错误.)

Objective-c相关问答推荐

Apple Silicon 上的 dispatch_time 计算失败

Clang:将 id 之类的类型转换警告提升为 class

iOS8:退出应用程序后不久出现蓝条正在使用您的位置

通过指针算术访问数组值与 C 中的下标

具有动态高度的子视图的自动布局 UIScrollView

animateWithDuration:animations: 会阻塞主线程吗?

如何在旋转时定义 CollectionView 的大小

将 NSNumber 转换为 NSDecimalNumber

判断是否显示 UIAlertView

为 iphone 应用程序设置自动构建服务器的最佳实践?

CABasicAnimation 无 HUGE_VALF 无限重复?

iOS - 应用程序关闭时的核心位置和地理围栏

我可以以编程方式滚动到 UIPickerView 中所需的行吗?

Objective-C 属性的默认属性是什么?

用于 iOS 开发的 LLVM 与 GCC

dyld:找不到符号:try 运行 iOS 应用程序时的 _NSURLAuthenticationMethodClientCertificate

无法加载 xcode 项目,因为它已从另一个项目或工作区打开

判断文件是否存在于路径中

从带有参数的方法名称创建 Select 器

CMTime 秒输出