aclass.h

@interface aClass : NSObject {
    NSString *name;
}

@property (nonatomic, retain) IBOutlet NSString *name;

@end

aclass.m 

@implementation aClass

@synthesize name;

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

- (void)test1 {
    name = @"hello";
}

- (void)test2 {
    self.name = @"hello";
}

以上面为例.有人能解释一下name = @"hello"self.name = @"hello"的区别吗?谢谢

编辑:后续问题:How to write my own setter for an ivar, i.e.: self.ivar = ...?

推荐答案

BE AWARE, THIS POST IS OLD !

这篇文章来自前十年.

请务必阅读下面的重要脚注,干杯!!


当你刚刚开始的时候,真的很难理解这一切.

以下是一些简单实用的经验法则.

重复一下,这篇帖子是FOR BEGINNERS.

这里的目标是让你从起跑线上移动quickly步,在大多数情况下都能自信地使用该系统.

Later,你可以真正了解这些问题的内部运作.

(1) 永远不要说name=@"hello".Always say self.name=@"hello". 在整个项目范围内搜索name,确保在设置或更改它时总是说self.name而不是name.

(2) 你知道所有关于内存管理、初始化、释放等令人愤怒的事情.如果你用的是self 思考,it takes care of all that for you.酷吧?

(3) self 思考是特别有用的,因为你可以在前进的过程中获得easily "change" the string(或任何东西).所以,这样做完全可以,

self.name=@"aa";  
self.name=@"bb";  
self.name=@"cc";  

然而(一句话)you can never, ever, for any reason, do this...

name=@"aa";
name=@"bb";
name=@"cc";

(*)关于你的字面问题,"请解释name = @"hello"self.name = @"hello"?"之间的区别这很容易做到.

第一个是just setting a variable.你知道,就像过go 的"x=42"岁,那时生活很简单,我们才13岁.

第二个是完全不同的,特别是it is calling a complicated routine(被称为"塞特")为你做了很多令人惊讶的事情.

这就是你问题的字面答案.The first one just sets the variable(别忘了,这里有很多指针和其他奇怪的东西,通常你只是随意地设置指针).The second one actually calls a big complicated routine,因此为你做了很多事情.

再一次,第二个和说...

[name bigComplicatedRoutineHere:@"hello"];

...记住语法self. ... is literally calling a routine是非常有帮助的.

事实上,一些关于这个话题的思想家认为,当他们把这self.X个语法引入[X complicatedThingHere]的意思时,这是一个愚蠢的 idea .它引入了很多困惑,并且.

就我个人而言,我花了九年多的时间才弄清楚这一点.:-)所以,我再次强调,你们必须记住,当你们说self.x时,实际上是you are actually calling a routine.

重复:"self-dot"语法实际上调用了一个 routine .(事实上,我相信其中一个预处理器只是将其扩展到了[x amazingStuffHere].)

我试着用一种能让你继续前进的方式来回答这个问题,让你在学习内存管理、属性等知识的同时,能够提升和使用更多的功能.如果你比这篇文章更先进,就忽略它吧.

Please note that this post is meant to be advice for beginners来启用它们to keep going and not get infuriated.希望有帮助!


2014 update! Important Note on ARC for beginners ...

注意,这篇帖子现在已经five years old了!成千上万的初学者阅读了这本书,还有很多后续问题等.请注意,在今天这个新的"ARC世界".在某种程度上:如果你是一个初学者:你应该差不多only use!!个属性.也就是说,在任何时候、任何地方都要使用"self .无论什么".无论如何,请注意,这篇文章中的信息"基本上是历史性的",而且每天都在变得越来越重要.当然,不言而喻,一旦你成为一名专家,你将需要并且将理解这一切的每一个微妙细节.希望它能帮助别人.

Objective-c相关问答推荐

Objective-C - 将浮点数转换为字符串的其他方法

iPhone:将日期字符串转换为相对时间戳

如何可靠地检测 iOS 9 上是否连接了外部键盘?

保存 UIImage,以错误的方向加载它

获取按其各自值排序的 NSDictionary 键

NSTimeInterval 格式

在objective-c中创建现在的时间戳作为NSNumber

混合 Objective-C 和 C++

如何测试推送通知在我的应用程序中是否有效

Objective C 静态类变量

我如何使用 initWithCoder 方法?

无法加载从笔尖引用的图像

从 UIPageViewController 中移除视图控制器

CFURLCopyResourcePropertyForKey 失败,因为通过 URL 没有方案

在 Objective C 中,你能判断一个对象是否具有特定的属性或消息吗?

如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格

如何在 iOS 7 启动期间更改状态栏样式

Cocoapods ld:找不到-lPods-Projectname 的库

ARC 下的 NSString 属性应该是强的还是复制的?

AVAudioPlayer 不播放任何声音