self.xxx和直接在Obj-C中调用xxx有什么不同?

时间:2011-12-29 08:29:34

标签: objective-c

例如,我有一个UIViewController,并且有一个值:

NSString *testString;

@property (nonatomic, retain) NSString *testString;
<。>中的

@synthesize testString;

这两行代码之间有什么不同:

testString = @"something";
self.testString = @"something";

3 个答案:

答案 0 :(得分:1)

第一种情况为testString分配了新值,您正在直接访问testString

testString = @"something";

在第二种情况下:

self.testString = @"something";

您通过调用setter来调用@synthesize testString,并确认它是属性。

第二种情况调用生成的[aUIViewControllerObject setTestString: @"something"],其中保留@"something" NSString(因为testString属性声明为retain参数),旧的值为autoreleasedreleased,新值已分配给testString

答案 1 :(得分:0)

self.testString = @"something";隐式调用setTestString:方法。在您的情况下,它意味着:

-(void) setTestString: (NSString*) newString
{
    if (testString != newString)
    {
        [testString release];
        testString = [newString retain];
    }
}

答案 2 :(得分:0)

如果您将属性声明为retaincopy,则非ARC代码中的

会有很大差异。在这两种情况下,当你拨打self.property时,幕后会有更多的事情发生。非常简单,retain做了类似的事情:

- (void)setFoo:(NSString *)newFoo {
  [newFoo retain];
  [foo release];
  foo = newFoo;
}

并且复制它就像是:

- (void)setFoo:(NSString *)newFoo {
  NSString *oldFoo = foo;
  foo = [newFoo copy];
  [oldFoo release];
}

}