iOS基础知识:私有财产,公共设定者/获取者

时间:2014-05-07 14:04:19

标签: ios objective-c model

我一直在阅读教程,我现在正在设计模型的架构,因为我是Objective-C的新手,我不是确定标准是否像Java那样你有公共设定者/获取者和私有属性。这是我想问的一个问题。

如果标准如此,则在*.m文件@interface中声明私有属性,但我如何@syntetize setter / getter 以及如何从外面打电话给他们:是[object SetProperty:property] ?

如果标准不同,我可以得到一个模型类的例子吗?

提前致谢。

5 个答案:

答案 0 :(得分:3)

属性本质上是一个类提供某些访问器方法的承诺。例如:

@property(strong, nonatomic) Foo *foo;

是一个承诺,该类提供-foo-setFoo:方法。因此,如果您希望访问者是公共的,请在类的公共接口(即头文件)中声明该属性,并使用它完成。

确实可以访问支持该属性(_foo的实例变量,除非您指定了不同的名称),但是直接访问另一个对象的实例变量的形式非常差。 Objective-C中的许多内容都受约定的约束,这通常足以避免问题。此外,给定属性 完全不支持任何实例变量:fullName之类的属性可能会从firstName和{{1}等其他属性计算出来。因此,除了客户的惯例之外,还有很好的理由避免直接访问ivars。

答案 1 :(得分:1)

您可以创建私有属性并创建自己的公共setter / getter方法。通过此方法,您可以重新分配或检索值。

@interface Person : NSObject
-(void)setTheName:(NSString *)fullName;
-(NSString *)theName;
@end

实施档案:

#import "Person.h"

@interface Person()
@property(atomic) NSString *fullName;
@end

@implementation Person

-(void)setTheName:(NSString *)fullName{
    self.fullName = fullName;
}

-(NSString *)theName{
    return self.fullName;
}

@end

在上面是私有的,但你可以检查选择器是否仍然存在(但会发出警告)

if ([p respondsToSelector:@selector(setFullName:)]) {
    [p performSelector:@selector(setFullName:) withObject:@"Anoop"];
}
NSLog(@">>>> %@",[p theName]);

输出将是:

 >>>> Anoop

但是,很少需要从外部设置任何私有财产。如果这是要求,我们可以公开财产。

答案 2 :(得分:1)

如果要授予对属性的访问权限,通常的方法是使用类的.h文件中的关键字@property来定义属性。这将自动定义一个setter和一个getter,你不需要从Xcode 4.4开始合成你的属性。

您的私人属性可以在您的.m文件中访问,并且默认情况下将使用“_”作为前缀的属性名称。

答案 3 :(得分:0)

确实,Objective-C使用的是另一种术语,而不是像Java这样的大多数其他语言。如果我得到您要求的内容,如果您希望在类外部直接提供属性,则必须在.h文件中声明该属性。但是,如果要隐藏代码的实现,可以在.m文件中声明属性,并向外界提供setter / getter,只返回您想要显示的信息。

@synthesize子句给我一个简单的东西。通过综合属性,getter / setter将自动实现,您不需要自己完成。

这会回答你的问题吗?

答案 4 :(得分:0)

了解声明属性会导致编译器为您创建访问器。因此,如果我个人需要一个伪私有属性我在实现中声明它,如果我需要伪公共属性我在标头中声明它。公共吸气剂/私人定位器可以如下所示进行处理。没有必要创建自己的setter和getter更喜欢使用属性,因为它节省了写入setter / getter;

标题(.h)中的

  @interface Person : NSObject
     @property (nonatomic, readonly) NSString *fullName;
  @end

在实现文件(.m)

#import "Person.h"

@interface Person()
@property (nonatomic, readwrite) NSString *fullName;
@end

@implementation Person

 ... whatever this class does

// self.fullName = @" John Doe&#34 ;;

@end