Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone self.ivar和ivar之间的区别?_Iphone_Objective C_Ios - Fatal编程技术网

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]; 
         } 
}