iPhone 属性

标签 iphone objective-c ios

我提出了几个简单的问题,以确保我在我的应用程序中正确使用属性。网上看了很多,还是不清楚。非常感谢任何帮助或建议。

(1) 我不太确定该声明是否有效,以及为什么需要它。

@synthesize personName = _personName; 

为什么需要 _personName 变量?与仅仅创建一个属性并合成该变量 personName 相比,这样做有什么好处。

@property (nonatomic, retain) NSString *personName;

(2) 在我的应用程序中,我应该访问属性变量 self.personName 还是使用 _personName 变量。我相信 self.personName 到那时又是正确的,为什么 _personName 还在?

(3) 我也有点困惑我应该在 dealloc() 中释放哪个变量以及我应该在 viewDidLoad() 中将哪个变量设置为 nil。我也不知道是否应该对 didReceiveMemoryWarning() 方法进行任何更改。

@interface ViewController : UIViewController
{
    NSString *_personName;
}

@property (nonatomic, retain) NSString *personName;

@end



@implementation ViewController

@synthesize personName = _personName;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.personName = [[NSString alloc] initWithString:@"John Doe"];

    NSLog(@"Name = %@", self.personName);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (void)dealloc
{
    [super dealloc];
}

@end

最佳答案

@synthesize personName = _personName;
  1. 该语句为 personName 属性创建访问器方法。您已指定访问器应使用名为 _personName 的实例变量。如果您只有 @synthesize personName;,访问器将使用 personName 作为实例变量。

  2. 您通常应该使用访问器方法,如 self.personNamesomePerson.personNamesomePerson.personName = @"Joe"; 。如果您不关心备份 personName 属性的 ivar 的名称,则无需指定它。

  3. 使用 -viewDidLoad 中的访问器,如:self.personName = nil;。与 -didReceiveMemoryWarning: 相同。是否在 -dealloc 中使用 ivar 或属性是有争议的,并且在某种程度上是个人喜好问题。在 -dealloc 中使用属性访问器的主要问题是,如果您的类被子类化并且访问器被覆盖,它可能会导致问题。通常,您不必担心这一点,因为您知道您的类不会被子类化。

  4. 发布后将 ivar 设置为 nil 也值得商榷。许多人认为这样做是一种很好的风格,而另一些人则认为这是在浪费时间。使用你最好的判断。这当然不是必要的,而是一些人认为是良好内务管理的问题。

关于iPhone 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657154/

相关文章:

iphone - EventKit eventsMatchingPredicate 搜索是否从重复事件中拾取单个实例?

c - 从整数中获取浮点值

iphone - 检测IOS设备类型

ios - 在 Swift 中 segue 之后从堆栈中移除(删除) View /viewController 的正确方法

ios - 如果应用程序包不包含推送通知中收到的 "loc-key"的 key 怎么办?

iphone - Monotouch 替换 RootViewController

iphone - 在 Objective-C 中以编程方式计算 IRR(内部 yield )和 NPV

iphone - 在启用 arc 的应用程序中重构 #ifndef __OBJC_GC_

ios - 在我的 AppDelegate 中保留一个 CLLocationManager 是一种好习惯吗?

objective-c - Xcode 版本 (CFBundleShortVersionString) 和构建 (CFBundleVersion) 之间的区别