它似乎与消息传递一起工作([self sayHi]可以在任何方法中工作).
我不太明白为什么我不能使用self访问对象的私有成员(在下面的示例中,我显示我不能使用self.wIDth)
#import <Foundation/Foundation.h>// Write an Objective-C class@interface Rectangle : NSObject{ int wIDth ;}-(int)getWIDth;-(voID)setWIDth:(int)w;-(voID)sayHi;-(voID)sayHi:(Nsstring*)msg ;@end@implementation Rectangle-(int)getWIDth{ // <b>return self.wIDth ; // ILLEgal,but why?</b> // why can't I return self.wIDth here? // why does it think that's a "method"? return wIDth ;}-(voID)setWIDth:(int)w{ // <b>self.wIDth = w ; // ILLEgal</b> // again here,I CAN'T do self.wIDth = w ; wIDth = w ;}-(voID)sayHi{ puts("hi");}-(voID)sayHi:(Nsstring*)msg{ printf( "Hi,and %s\n",[ msg UTF8String ] ) ;}@endint main (int argc,const char * argv[]){ NSautoreleasePool * pool = [[NSautoreleasePool alloc] init]; Rectangle* r = [ Rectangle alloc ] ; [ r sayHi ] ; [ r setWIDth:5 ] ; printf( "wIDth is %d\n",[ r getWIDth ] ) ; [pool drain]; return 0;}解决方法 其他答案几乎是正确的,但并不完全正确.
在Objective-C中,没有任何对象[保存为块,但这是一个非常特殊的情况]永远在堆栈中.因此,self.wIDth没有意义.
但是,自我>宽度确实有效.由于self是对堆上分配的有效结构的引用,因此使用 – >运算符来获取成员变量是有道理的.
但是,在Objective-C的背景下,它通常也没有意义.也就是说,Objective-C通常假定保留封装的哲学.也就是说,您通常不会直接进入对象并使用实例变量 – 内部状态.相反,您使用访问器来获取/设置状态.通过这样做,对象(和子类)可以根据需要自定义getter / setter行为. (这包括键值观察和键值编码等机制).
self.wIDth恰好等同于[self wIDth]或[self setWIDth:… something ……]是上面的后果.那就是 .用于访问Objective-C类实例成员的运算符未以其他方式使用,并且可能因为属性访问的简写而被重载.
但是,属性访问和调用getter / setter方法之间几乎没有区别.因此,点表示法与方法调用同义.
在代码的上下文中,实例变量可以在类实现中透明地访问,并且没有前缀.
因此,你会使用wIDth = 5.0;而不是self.wIDth = 5.0;,通常.当然,后者确实等同于使用Objective-C 2.0的方法调用,原因如上所述.
总结以上是内存溢出为你收集整理的Objective-C中的self全部内容,希望文章能够帮你解决Objective-C中的self所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)