A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一只小菜鸟 中级黑马   /  2014-4-27 15:35  /  4947 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一只小菜鸟 于 2014-4-27 22:52 编辑
  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. int main(int argc, const char * argv[])
  4. {
  5.     Person *p = [[Person alloc] init];
  6.     [p test];
  7.     p.test;   //property access result unused - getters should not be used for side effect
  8.     return 0;  
  9. }
复制代码
  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject
  3. - (void)test;
  4. @end
复制代码
  1. #import "Person.h"
  2. @implementation Person
  3. -(void)test {
  4.     NSLog(@"test success!");
  5. }
  6. @end
复制代码
点语法可以直接调用方法?
//只是有个警告property access result unused - getters should not be used for side effects
上个帖子的也没人答,一起放这里把
  1.         NSDictionary *dict2 = @{@"k1": @"v1", @"k2": @"v2" };
  2.         NSEnumerator *enumerator = [dict keyEnumerator];
  3.         id key = nil;
  4.         //这样是不会警告,
  5.         while (key = [enumerator nextObject]) {
  6.         //改成这样key = enumerator.nextObject 就会出现警告。赋值必须得圆括号
  7.         //得改成while((key = enumerator.nextObject));if等同
  8.         //我简单的测试了下,自己建了个类,用自己的get方法同样出现这个警告
  9.             
  10.         //另外,点语法不是get,和set方法么,enumerator.nextObject,[enumerator nextObject]返回值不同?
  11.         //求科普,[enumerator nextObject],这为什么没警告,
  12.             id value = [dict2 objectForKey:key];
  13.             NSLog(@"%@", value);
复制代码




评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

12 个回复

倒序浏览
我跟楼主也有同样的困惑,自己翻译了下错误提示也觉得很古怪,不知道什么意思
回复 使用道具 举报
楼主你这种使用方法是错误的。点语法只能作用于get和set方法。不能用于其他方法。p.test意思就是获取p中成员变量_test的值。你根本没有_test这个成员变量。所以出现这个警告。直接用[self test]调用。
回复 使用道具 举报
本帖最后由 dawn.dai 于 2014-4-27 21:57 编辑

#import <Foundation/Foundation.h>

@interface person : NSObject
{
  
    int _age;
}

- (void) setAge: (int)age;
- (int)age;
@end
_______________________________
#import "person.h"

@implementation person

- (void) setAge: (int)age
{
   
    _age=age;
}
- (int)age
{
   
    return _age;
   
}
@end
——————————————————
#import <Foundation/Foundation.h>
#import "person.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
      
        person *p =[[person alloc]init];
      // p.age =10;
        [p setAge:10]; //和上面的等价oc的点语法与java中的点不同,写这个点Xcode会自动把它转化成下面的setAge方法
        NSLog(@"age=%d",p.age);//这个p.age是调用age的get方法,等价于[p age]
    }
    return 0;
}

回复 使用道具 举报
dawn.dai 发表于 2014-4-27 21:55
#import

@interface person : NSObject

大哥,看清问题在回答啊。。。
回复 使用道具 举报
gaoxinglei123 发表于 2014-4-27 21:02
楼主你这种使用方法是错误的。点语法只能作用于get和set方法。不能用于其他方法。p.test意思就是获取p中成 ...

只是警告 又不算错误。。。。。。。你能告诉我为什么会直接用[self test]调用么。
我前面一个帖子也碰到了这个纠结的问题。。。同样没得到解决。
回复 使用道具 举报
一只小菜鸟 发表于 2014-4-27 22:48
大哥,看清问题在回答啊。。。

好吧,俺走神了{:3_66:},上面的问题它把test当成get方法来看可以说弱语法只警告不报错,下面的同等大神解惑
回复 使用道具 举报
p.test这么直接写默认被当做get的方法来使用了。但是警告提示这个get方法的值没有被使用也就是没有赋给其他对象或是变量。xcode推荐使用[ ]这种方式获得属性值和调用方法。
回复 使用道具 举报
一只小菜鸟 发表于 2014-4-27 22:50
只是警告 又不算错误。。。。。。。你能告诉我为什么会直接用[self test]调用么。
我前面一个帖子也碰到 ...

哥们。我是说你点语法的使用方法是错误的。虽然你这个只是个警告。但是 你对点语法的理解是完全错了。[self test]代表调用自身的test成员方法。这是oc调用方法的 标准写法啊
回复 使用道具 举报
Freedam 发表于 2014-4-28 00:05
p.test这么直接写默认被当做get的方法来使用了。但是警告提示这个get方法的值没有被使用也就是没有赋给其他 ...

首先,我没有定义成员变量,更没有用@property,也就说没有把test当成变量,和对象。。。
其次,我定义的方法是没有返回值的。。。
我知道他的推荐,但就是这里产生的疑问。p.test调用了方法。。
另外你可以看看我第一个问题下面的一个疑问
回复 使用道具 举报
gaoxinglei123 发表于 2014-4-28 07:46
哥们。我是说你点语法的使用方法是错误的。虽然你这个只是个警告。但是 你对点语法的理解是完全错了。[se ...

你觉得我是真的完全理解错么。。。不是因为理解了,产生这个疑问么。
问的是p.test  ,你给我讲它直接会转换为[self test],
问你为什么转这个,你回我[self test]的意思。。。是我们不在同一个频道么。。
我知道p.test可能有问题,但是错误的能成功运行么。
PS:p.test不能用来调用带参方法。
你可以你可以看看我第一个问题下面的一个疑问,你就不会这么说了。
回复 使用道具 举报
一只小菜鸟 发表于 2014-4-28 12:52
你觉得我是真的完全理解错么。。。不是因为理解了,产生这个疑问么。
问的是p.test  ,你给我讲它直接会 ...

这个p.test在底层怎么实现的我还真不知道。不过肯定不会是简简单单的转化为[self test]
回复 使用道具 举报
       点语法,确实是针对get方法和set方法的,p.test之所以能调用是因为编译器就把当成一个get方法。编译器之所以把它当成get方法是因为没有向它赋值,所以没有参数。
       然后你的返回值是void,property access result unused 的意思是属性访问结果未使用,是get方法调用完没有使用get方法的结果。你也可以随便起一个函数名字- (void)test:(int)num,传入一个参数,它也可以当成set方法调用。
如p.test=20;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马