Iphone self.ivar和ivar之间的区别?
以以上为例。有人能解释一下Iphone self.ivar和ivar之间的区别?,iphone,objective-c,ios,Iphone,Objective C,Ios,以以上为例。有人能解释一下name=@“hello”和self.name=@“hello”之间的区别吗?谢谢 编辑:后续问题:self.name使用您定义的访问器和/或变异器(这是非原子的,保留在您的案例中)。因此,当您调用self.name=foo时,它将调用编译器生成的setName:(NSString*)strmutator,它将首先释放当前字符串,然后保留新字符串,最后将名称设置为保留的字符串 只需调用name=foo只需为foo指定名称 这也意味着您只能在为ivar定义属性时调用sel
name=@“hello”
和self.name=@“hello”
之间的区别吗?谢谢
编辑:后续问题:
self.name
使用您定义的访问器和/或变异器(这是非原子的,保留在您的案例中)。因此,当您调用self.name=foo
时,它将调用编译器生成的setName:(NSString*)str
mutator,它将首先释放当前字符串,然后保留新字符串,最后将名称设置为保留的字符串
只需调用name=foo
只需为foo指定名称
这也意味着您只能在为ivar定义属性时调用self.xxx
,否则编译器会告诉您它不知道它(ivar) 请注意,这篇文章已经过时了!
这篇文章来自前十年
请务必阅读下面的重要脚注,干杯
当你刚刚开始的时候,真的很难理解这一切 这里有一些简单实用的经验法则供初学者使用 重复一遍,这篇文章是为初学者准备的 这里的目标是让您能够快速地从起跑线出发,在大多数情况下都能自信地使用该系统 稍后,您可以真正了解这些问题的内部工作原理 (1) 永远不要说
name=@“你好”
总是说self.name=@“你好”
。在项目范围内搜索名称
,并确保在设置或更改它时总是说self.name
,而不是name
(2) 你知道所有关于内存管理、初始化、释放等令人恼火的事情。如果你使用self-thingy,它会为你解决所有这些问题。酷吧
(3) self thingy特别有用,因为您可以在进行操作时轻松地“更改”字符串。所以,这样做完全可以
aclass.m
@implementation aClass
@synthesize name;
- (void)dealloc {
[name release];
[super dealloc];
}
- (void)test1 {
name = @"hello";
}
- (void)test2 {
self.name = @"hello";
}
然而(一句话)无论出于什么原因,你永远都不可能这么做
self.name=@"aa";
self.name=@"bb";
self.name=@"cc";
(*)关于你的字面问题,“请解释name=@“hello”
和self.name=@“hello”?”
这很容易做到
第一个是仅设置一个变量。你知道,就像在过去的日子里,生活很简单,我们才13岁
第二个是完全不同的,特别是它调用了一个复杂的例程(被称为“setter”),为你做很多令人惊讶的事情
这就是你问题的字面答案第一个变量只是设置变量(别忘了,有很多指针和其他奇怪的东西,通常你不能随意设置指针)第二个程序实际上调用了一个复杂的大程序,因此为您做了很多事情
再一次,第二句话就像说
name=@"aa";
name=@"bb";
name=@"cc";
…记住语法self….非常有帮助代码>实际上是调用例程
事实上,一些关于这个话题的思想家认为这是一个愚蠢的想法,当他们把这个self.X
语法引入到[X complexidthinghere]
中时。它引入了很多困惑,每个初学者都会确切地问你在问什么
就我个人而言,我花了九年多的时间才弄清楚这一点因此,我再次强调,您必须记住,当您说self.x
时,实际上,您实际上是在调用例程
重复:“self-dot”语法实际上调用了一个例程。(事实上,我相信其中一个预处理器只是将其扩展为[x amazingstaffhere]
)
我试图以一种能让您继续前进并允许您在学习内存管理、属性等知识的同时提高和使用更多功能的方式来回答这个问题。如果你比这篇文章更先进,就忽略它吧
请注意,这篇文章是给初学者的建议,让他们坚持下去,不要生气。希望有帮助
2014年更新!关于ARC的重要提示,适合初学者。。。
注意,这篇文章已经有五年了!它已经被成千上万的初学者阅读过,并且有很多后续问题等。请注意,今天在新的“ARC世界”。在某种程度上:如果你是一个初学者:你应该只使用属性。也就是说,在任何时候、任何地方都要使用“自我,无论什么”。无论如何,请注意,这篇文章中的信息“基本上是历史性的”,而且每天都在变得越来越重要。当然,不言而喻,一旦你成为一名专家,你将需要并且将理解所有这些细节。希望它能帮助别人。name=@“Joe”
您直接访问变量,绕过Cocoa费劲为您创建的getter方法。通常,这不是最明智的做法
self.name=@“乔”
现在,您将完成要求cocoa为您创建的方法。这通常是最好的方法
根据经验,始终使用Cocoa提供的setter和getter,只有一个例外:dealloc。在dealloc中,应始终直接释放变量,而不是通过getter方法:
[name bigComplicatedRoutineHere:@"hello"];
在dealloc中避免访问器的原因是,如果在触发行为的子类中存在观察者或重写,那么它将从dealloc中触发,这绝不是您想要的(因为对象的状态将不一致)
奥托
[name bigComplicatedRoutineHere:@"hello"];
-(void) dealloc {
[name release]; // instead of [[self name] release]
...
[super dealloc];
}
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject
@property (retain) NSString* caption;
@property (retain) NSString* photographer;
@end
-(void)setObj:(ClassX*) value
{
if (obj != value)
{
[obj release];
obj = [value retain];
}
}